11.3. Многоколоночные индексы#

11.3. Многоколоночные индексы

11.3. Многоколоночные индексы #

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

CREATE TABLE test2 (
  major int,
  minor int,
  name varchar
);

(скажем, вы храните свой /dev каталог в базе данных...) и часто выполняете запросы вроде:

SELECT name FROM test2 WHERE major = constant AND minor = constant;

Если это целесообразно, то можно определить индекс на столбцах major и minor вместе, например:

CREATE INDEX test2_mm_idx ON test2 (major, minor);

В настоящее время только типы индексов B-дерево, GiST, GIN и BRIN поддерживают индексы с несколькими ключевыми столбцами. Возможность использования нескольких ключевых столбцов не зависит от того, можно ли добавлять столбцы INCLUDE в индекс. Индексы могут содержать до 32 столбцов, включая столбцы INCLUDE. (Этот предел можно изменить при сборке Tantor BE; см. файл pg_config_manual.h).

Многоколоночный индекс B-дерева может использоваться с условиями запроса, которые включают любое подмножество столбцов индекса, но индекс наиболее эффективен, когда есть ограничения на ведущие (самые левые) столбцы. Точное правило состоит в том, что ограничения равенства на ведущих столбцах, а также любые ограничения неравенства на первом столбце, который не имеет ограничения равенства, будут использоваться для ограничения части индекса, которая сканируется. Ограничения на столбцы справа от этих столбцов проверяются в индексе, поэтому они экономят посещения таблицы, но не уменьшают часть индекса, которую нужно просканировать. Например, при наличии индекса на (a, b, c) и условии запроса WHERE a = 5 AND b >= 42 AND c < 77, индекс должен быть просканирован от первой записи с a = 5 и b = 42 до последней записи с a = 5. Записи индекса с c >= 77 будут прне указаны, но их все равно нужно будет просканировать. В принципе, этот индекс может использоваться для запросов, которые имеют ограничения на b и/или c без ограничения на a - но в этом случае нужно будет просканировать весь индекс, поэтому в большинстве случаев планировщик предпочтет последовательное сканирование таблицы перед использованием индекса.

Многоколоночный индекс GiST может использоваться с условиями запроса, которые включают любой поднабор столбцов индекса. Условия на дополнительные столбцы ограничивают записи, возвращаемые индексом, но условие на первый столбец является наиболее важным для определения того, сколько индекса необходимо просканировать. Индекс GiST будет относительно неэффективным, если его первый столбец имеет только несколько различных значений, даже если в дополнительных столбцах есть много различных значений.

Многоколоночный индекс GIN может использоваться с условиями запроса, которые включают любое подмножество колонок индекса. В отличие от B-дерева или GiST, эффективность поиска по индексу одинакова независимо от того, какие колонки индекса используются в условиях запроса.

Многостолбцовый индекс BRIN может использоваться с условиями запроса, которые включают любое подмножество столбцов индекса. Как GIN и в отличие от B-дерева или GiST, эффективность поиска по индексу одинакова независимо от того, какие столбцы индекса используются в условиях запроса. Единственная причина иметь несколько индексов BRIN вместо одного многостолбцового индекса BRIN на одной таблице - это наличие различного параметра хранения pages_per_range.

Конечно, каждая колонка должна использоваться с операторами, соответствующими типу индекса; предложения, которые включают другие операторы, не будут рассматриваться.

Следует использовать мультиколоночные индексы с осторожностью. В большинстве ситуаций индекс на одной колонке достаточен и экономит пространство и время. Индексы с более чем тремя колонками вряд ли будут полезны, если использование таблицы чрезвычайно стилизовано. См. также Раздел 11.5 и Раздел 11.9 для обсуждения достоинств различных конфигураций индексов.