Конференция "Базы" » Индекс по полю и максимальному значению другого.
 
  • Дмитрий С © (09.06.15 16:14) [0]
    Есть
  • Дмитрий С © (09.06.15 16:14) [1]
    Нечаянно нажал на Enter. Сейчас допишу вопрос.
  • Дмитрий С © (09.06.15 16:20) [2]
    Есть таблица, с составным первичным ключем:
    (INTEGER id, INTEGER INT ver, ...), где ver сам по себе также уникальный.

    Необходимо построить такой индекс, в который попадут только записи с id и максимальным для него значением в ver.

    А также построить так запрос, чтобы СУБД догадался что выбирать надо записи только из этого индекса.

    Есть предложение как это сделать?

    База postgres.
  • Kilkennycat © (09.06.15 16:27) [3]
    чет как-то странно.

    > id и максимальным для него значением в ver.

    предполагает неуникальность id
  • Дмитрий С © (09.06.15 16:36) [4]

    > Kilkennycat ©   (09.06.15 16:27) [3]
    >

    Так и есть. Уникальный (id, ver)
  • Ega23 © (09.06.15 16:55) [5]
    create index ttt on table (ver, id) desc
    ?
  • картман © (09.06.15 18:39) [6]
    select id, max(ver) from table group by id
  • Inovet © (09.06.15 20:51) [7]
    > [5] Ega23 ©   (09.06.15 16:55)
    > create index ttt on table (ver, id) desc

    А не наоборот и без desc
    create index ttt on table (id, ver)
    ?
  • Inovet © (09.06.15 20:54) [8]
    > [7] Inovet ©   (09.06.15 20:51)

    В смысле - не выберет движок по такому индексу?
  • Ega23 © (09.06.15 21:09) [9]

    > В смысле - не выберет движок по такому индексу?


    Пробывать надо. Тем более в Postgres, он славен своеобразием.
  • Kilkennycat © (09.06.15 22:02) [10]

    > Так и есть. Уникальный (id, ver)

    если id уникальный, то не существует для одного id несколько ver в одной таблице, а значит и max бессмыслен.
  • Ega23 © (09.06.15 23:26) [11]

    > если id уникальный

    Костя, не тупи!
    Уникально сочетание (id, ver).
  • Kilkennycat © (10.06.15 00:58) [12]
    а...
  • sniknik © (10.06.15 11:07) [13]
    > Необходимо построить такой индекс,
    если вопрос именно про индекс по части значений, то у postgres-а должна быть такая возможность... вот типа этой
    https://msdn.microsoft.com/ru-ru/library/cc280372.aspx
    иначе ничего не выйдет.
  • Дмитрий С © (10.06.15 20:25) [14]

    > sniknik ©   (10.06.15 11:07) [13]

    Наверняка есть.
    Непонятно как задать такой индекс и как по нему выбирать эффективно.
    Понятно как сделать индекс включающий только строки с (Ɐid, ver=0). А вот как построить такой, чтобы (Ɐid, ver=(SELECT MAX(ver) FROM ... WHERE id=parentSelect.id)). И главное как по нему потом эффективно выбирать.
  • sniknik © (10.06.15 21:17) [15]
    как задать понятно, не понятно будет ли оно работать... (а теперь со всей этой "хренью" попробуем взлететь)
    вот примерно так, по логике -
    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. ИМХО, "что то не то в датском королевстве".
  • Дмитрий С © (11.06.15 13:21) [16]

    > ИМХО, "что то не то в датском королевстве"

    Меня тоже не покидает эта мысль.

    Есть идея чтобы все версии некого документа хранились в одной таблице. Для каждого обновления документа добавляется новая строка.

    Вот и думаю как сделать. Но на данный момент пока решил завести отдельную таблицу с логом, где писать что изменилось.
  • Игорь Шевченко © (11.06.15 15:19) [17]
    В оракле знаю, как сделать. Добавить поле "Последняя версия", у непоследних присваивать NULL этому полю, у последней, соответственно, не NULL.
 
Конференция "Базы" » Индекс по полю и максимальному значению другого.
Есть новые Нет новых   [134427   +34][b:0][p:0.001]