-
Есть
-
Нечаянно нажал на Enter. Сейчас допишу вопрос.
-
Есть таблица, с составным первичным ключем: (INTEGER id, INTEGER INT ver, ...), где ver сам по себе также уникальный.
Необходимо построить такой индекс, в который попадут только записи с id и максимальным для него значением в ver.
А также построить так запрос, чтобы СУБД догадался что выбирать надо записи только из этого индекса.
Есть предложение как это сделать?
База postgres.
-
чет как-то странно.
> id и максимальным для него значением в ver.
предполагает неуникальность id
-
> Kilkennycat © (09.06.15 16:27) [3] >
Так и есть. Уникальный (id, ver)
-
create index ttt on table (ver, id) desc ?
-
select id, max(ver) from table group by id
-
> [5] Ega23 © (09.06.15 16:55) > create index ttt on table (ver, id) desc
А не наоборот и без desc create index ttt on table (id, ver) ?
-
> [7] Inovet © (09.06.15 20:51)
В смысле - не выберет движок по такому индексу?
-
> В смысле - не выберет движок по такому индексу?
Пробывать надо. Тем более в Postgres, он славен своеобразием.
-
> Так и есть. Уникальный (id, ver)
если id уникальный, то не существует для одного id несколько ver в одной таблице, а значит и max бессмыслен.
-
> если id уникальный
Костя, не тупи! Уникально сочетание (id, ver).
-
а...
-
-
> sniknik © (10.06.15 11:07) [13]
Наверняка есть. Непонятно как задать такой индекс и как по нему выбирать эффективно. Понятно как сделать индекс включающий только строки с (Ɐid, ver=0). А вот как построить такой, чтобы (Ɐid, ver=(SELECT MAX(ver) FROM ... WHERE id=parentSelect.id)). И главное как по нему потом эффективно выбирать.
-
как задать понятно, не понятно будет ли оно работать... (а теперь со всей этой "хренью" попробуем взлететь) вот примерно так, по логике - CREATE NONCLUSTERED INDEX id_ver ON TableIdVer(id,ver) WHERE ver=(SELECT Max(ver) FROM TableIdVer t2 WHERE t2.id=TableIdVer.id)
но вряд ли это сработает, для MSSQL в описании есть предупреждение - только простые условия. ну и подумать с каким трудом подобный индекс будет перестраиваться, если вдруг синтаксис пройдет, то понятно почему.
а вот насчет "потом эффективно выбирать" не парься, указываешь его в условии (WITH ...) и все, сервер сам разберется, проигнорирует отсутствующие значения.
p.s. ИМХО, "что то не то в датском королевстве".
-
> ИМХО, "что то не то в датском королевстве"
Меня тоже не покидает эта мысль.
Есть идея чтобы все версии некого документа хранились в одной таблице. Для каждого обновления документа добавляется новая строка.
Вот и думаю как сделать. Но на данный момент пока решил завести отдельную таблицу с логом, где писать что изменилось.
-
В оракле знаю, как сделать. Добавить поле "Последняя версия", у непоследних присваивать NULL этому полю, у последней, соответственно, не NULL.
|