Многостолбцовые индексы и ORDER BY - PullRequest
0 голосов
/ 27 августа 2018

Документация PostgreSQL гласит, что если мы запустим запрос ... ORDER BY x ASC, y DESC к таблице с индексом ... (x ASC, y ASC), индекс нельзя будет использовать, поскольку направления не совпадают.

  1. Означает ли это, что этот индекс совершенно бесполезен, или может ядро ​​базы данных использовать индекс для упорядочивания части x ASC (а затем вручную отсортировать часть y DESC)?
  2. Что еслимы запускаем запрос ... WHERE x = 999 ORDER BY y DESC, можно ли использовать этот индекс?

1 Ответ

0 голосов
/ 27 августа 2018

1.

Нет , индекс не может быть использован, как предполагает руководство.Вы можете проверить, создав такой индекс для любой таблицы, а затем, только для сеанса тестирования:

SET enable_seqscan = OFF;

Тогда:

EXPLAIN
SELECT * FROM tbl ORDER BY ORDER BY x, y DESC;

Теперь, если индекс можно использовать в любой способ, это было бы.Но вы все равно увидите последовательное сканирование.

Существует ожидающий патч для реализации «инкрементной сортировки», но его пока нет.См .:

Исключение углового случая: если возможно сканирование только для индекса индекс может все еще использоваться, если он существенно меньше таблицы.Но строки должны быть отсортированы с нуля.

Связанный:

2.

Да , индекс идеально подходит.

(Даже работает, если индекс имеет y ASC. Его можно сканировать в обратном направлении. Только NULLв этом случае размещение является недостатком.)

Конечно, если x = 999 является стабильным предикатом (это всегда 999, в котором мы заинтересованы) и более чем в нескольких строках есть разные x,тогда частичный индекс будет еще более эффективным:

CREATE INDEX ON tbl (y DESC) WHERE x = 999;

db <> fiddle здесь

...