Помимо простого поиска строк, возвращаемых запросом,
индекс может предоставлять их в определенном отсортированном порядке.
Это позволяет выполнить требования запроса к ORDER BY сортировке
без отдельного этапа сортировки. Из типов индексов, поддерживаемых в настоящее время в Digital Q.DataBase, только B-дерево
может выдавать отсортированный результат — остальные типы индексов возвращают
соответствующие строки в неопределенном, зависящем от реализации порядке.
Планировщик запросов рассмотрит выполнение условия ORDER BY сортировки
либо путем сканирования подходящего доступного индекса,
либо путем последовательного сканирования таблицы в физическом порядке с выполнением явной
сортировки. Для запроса, требующего сканирования значительной части таблицы, явная сортировка, скорее всего, будет выполнена быстрее, чем использование индекса, так как она требует меньшего объема дискового ввода-вывода благодаря последовательному доступу к данным. Индексы наиболее эффективны в тех случаях, когда необходимо извлечь лишь небольшое количество строк. Важным
частным случаем является ORDER BY в сочетании с
LIMIT n: при явной сортировке потребуется обработать
все данные, чтобы определить первые n строк, но если имеется
индекс, соответствующий ORDER BY, первые n
строк могут быть извлечены напрямую, без сканирования всей оставшейся части таблицы.
По умолчанию индексы B-дерево хранят записи в порядке возрастания, при этом пустые значения (NULL) располагаются в конце (идентификатор TID таблицы используется в качестве дополнительного столбца для упорядочивания идентичных записей). Это означает, что прямое сканирование индекса по столбцу x формирует результат, соответствующий условию ORDER BY x
(или, если описывать более подробно, ORDER BY x ASC NULLS LAST). Индекс также можно сканировать в обратном направлении для получения результата, удовлетворяющего условию
ORDER BY x DESC
(или, если описывать более подробно, ORDER BY x DESC NULLS FIRST, так как
NULLS FIRST используется по умолчанию для ORDER BY DESC).
Порядок сортировки в индексе B-дерево можно настроить с помощью параметров ASC, DESC, NULLS FIRST,
и/или NULLS LAST при создании индекса; например:
CREATE INDEX test2_info_nulls_low ON test2 (info NULLS FIRST); CREATE INDEX test3_desc_index ON test3 (id DESC NULLS LAST);
Индекс, отсортированный по возрастанию с пустыми значениями (NULL) в начале, может удовлетворять условиям ORDER BY x ASC NULLS FIRST или
ORDER BY x DESC NULLS LAST в зависимости от того, в каком направлении выполняется сканирование.
Может возникнуть вопрос, зачем предоставлять все четыре варианта, если два варианта в сочетании с возможностью обратного сканирования охватывают все возможные случаи ORDER BY. В одностолбцовых индексах эти параметры действительно избыточны, но в многостолбцовых индексах они могут быть полезны. Рассмотрим индекс по двум столбцам (x, y): он может
удовлетворить ORDER BY x, y при сканировании в прямом направлении, или
ORDER BY x DESC, y DESC при сканировании в обратном направлении.
Однако приложению может часто требоваться использование
ORDER BY x ASC, y DESC. Такую сортировку невозможно получить с помощью обычного индекса, но это достижимо, если индекс определен как (x ASC, y DESC) или (x DESC, y ASC).
Очевидно, что индексы с порядком сортировки, отличным от используемого по умолчанию, являются довольно специализированной функцией, но иногда они позволяют добиться значительного ускорения определенных запросов. Целесообразность поддержки такого индекса зависит от того, насколько часто используются запросы, требующие специального порядка сортировки.