Digital Q.DataBase предоставляет несколько типов индексов:
B-дерево, Hash, GiST, SP-GiST, GIN, BRIN и расширение bloom. Каждый тип индекса использует определенный алгоритм, наиболее подходящий для тех или иных типов индексируемых условий. По умолчанию команда
CREATE INDEX создает
индексы B-дерево, подходящие для большинства стандартных задач.
Другие типы индексов можно выбрать с помощью ключевого слова
USING с последующим указанием имени типа индекса.
Например, для создания индекса Hash:
CREATE INDEXимяONтаблицаUSING HASH (столбец);
Индексы типа B-дерево могут обрабатывать запросы на равенство и поиск в диапазоне для данных, которые можно отсортировать в определенном порядке. В частности, Digital Q.DataBase планировщик запросов будет рассматривать возможность использования индекса B-дерево во всех случаях, когда индексированный столбец участвует в операциях сравнения с использованием одного из следующих операторов:
< <= = >= >
Конструкции, эквивалентные комбинациям этих операторов, такие как
BETWEEN и IN, также могут быть реализованы с помощью
поиска по индексу B-дерево. Кроме того, условие IS NULL или IS NOT
NULL для индексированного столбца может применяться вместе с индексом B-дерево.
Оптимизатор также может использовать индекс B-дерево для запросов, содержащих операторы сопоставления по шаблону LIKE и ~
если шаблон является константой и зафиксирован в начале строки — например, col LIKE
'foo%' или col ~ '^foo', но не
col LIKE '%bar'. Однако если в базе данных не используется локаль C, потребуется создать индекс со специальным классом операторов для поддержки индексирования запросов с сопоставлением с образцом; см.
Раздел 2.8.10 ниже. Также возможно использовать
индексы B-дерево для ILIKE и
~*, но только в том случае, если шаблон начинается с
неалфавитных символов, то есть символов, на которые не влияет
преобразование регистра.
Индексы B-дерево также могут использоваться для получения данных в отсортированном порядке. Это не всегда быстрее обычного сканирования и последующей сортировки, но часто оказывается эффективным.
Хеш-индексы хранят 32-битный хеш-код, вычисляемый на основе значения индексируемого столбца. Следовательно, такие индексы могут обрабатывать только простые сравнения на равенство. Планировщик запросов будет рассматривать использование хеш-индекса во всех случаях, когда индексируемый столбец участвует в сравнении с использованием оператора равенства:
=
Индексы GiST представляют собой не единый тип индекса, а инфраструктуру, позволяющую реализовывать различные стратегии индексирования. Соответственно, набор операторов, совместимых с индексом GiST, зависит от выбранной стратегии индексирования ( класса операторов). В частности, стандартный дистрибутив Digital Q.DataBase включает классы операторов GiST для нескольких двумерных геометрических типов данных, поддерживающих индексированные запросы с использованием следующих операторов:
<< &< &> >> <<| &<| |&> |>> @> <@ ~= &&
(См. Раздел 2.6.11 для получения информации о значении этих операторов.) Классы операторов GiST, входящие в стандартный дистрибутив, описаны в Таблица 7.14.1.
Множество других классов операторов GiST
доступно в contrib коллекции или в виде отдельных
проектов. Для получения дополнительной информации см. Раздел 7.14.2.
Индексы GiST также позволяют оптимизировать «поиск ближайших соседей» запросы, такие как
SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
который находит десять объектов, ближайших к заданной целевой точке. Возможность выполнения таких операций также зависит от используемого конкретного класса операторов. В Таблица 7.14.1, операторы, которые могут быть использованы таким образом, перечислены в столбце «Операторы упорядочивания».
Индексы SP-GiST, подобно индексам GiST, предоставляют инфраструктуру, поддерживающую различные типы поиска. SP-GiST позволяет реализовывать широкий спектр различных несбалансированных дисковых структур данных, таких как квадродеревья, k-мерные деревья и префиксные деревья (tries). Например, стандартный дистрибутив Digital Q.DataBase включает классы операторов SP-GiST для двумерных точек, которые поддерживают индексированные запросы с использованием следующих операторов:
<< >> ~= <@ <<| |>>
(См. Раздел 2.6.11 для получения информации о значении этих операторов.) Классы операторов SP-GiST, включенные в стандартный дистрибутив, описаны в Таблица 7.14.2. Для получения дополнительной информации см. Раздел 7.14.3.
Как и GiST, SP-GiST поддерживает «поиск ближайших соседей» поиска. Для классов операторов SP-GiST, поддерживающих упорядочивание по расстоянию, соответствующий оператор указан в «Операторы упорядочивания» столбце в Таблица 7.14.2.
Индексы GIN — это «инвертированные индексы» которые подходят для значений данных, содержащих несколько составных элементов, например массивов. Инвертированный индекс содержит отдельную запись для каждого составного элемента и позволяет эффективно обрабатывать запросы, проверяющие наличие определенных составных значений.
Подобно GiST и SP-GiST, GIN поддерживает множество различных пользовательских стратегий индексирования, и набор операторов, применимых к индексу GIN, зависит от выбранной стратегии. В качестве примера, стандартный дистрибутив Digital Q.DataBase включает класс операторов GIN для массивов, поддерживающий индексированные запросы с использованием следующих операторов:
<@ @> = &&
(См. Раздел 2.6.19 для получения информации о значениях этих операторов). Классы операторов GIN, входящие в стандартный дистрибутив, описаны в Таблица 7.14.3. Множество других классов операторов GIN доступно в contrib коллекции или в виде отдельных
проектов. Для получения дополнительной информации см. Раздел 7.14.4.
Индексы BRIN (сокращение от Block Range INdexes) хранят сводную информацию о значениях, размещенных в последовательных диапазонах физических блоков таблицы. Таким образом, они наиболее эффективны для столбцов, значения в которых сильно коррелируют с физическим порядком строк таблицы. Как и GiST, SP-GiST и GIN, индексы BRIN позволяют применять различные стратегии индексирования, а конкретный набор операторов, доступных для индекса BRIN, зависит от выбранной стратегии. Для типов данных с линейным порядком сортировки индексированные данные соответствуют минимальным и максимальным значениям столбца в каждом диапазоне блоков. Это обеспечивает поддержку индексированных запросов с использованием следующих операторов:
< <= = >= >
Классы операторов BRIN, включенные в стандартный дистрибутив, описаны в Таблица 7.14.4. Для получения дополнительной информации см. Раздел 7.14.5.