Индекс - для операторов
B-tree на flight_id отвечает на = 7, > 40, BETWEEN, но не на
flight_id % 2 = 0 - такого оператора в его operator class нет. Какой
AM знает какой оператор - решает operator class, объект каталога.
Карта каталогов
| Каталог | Что |
|---|---|
pg_am | методы доступа: btree, hash, gist, gin, spgist, brin |
pg_opclass | operator class: тип + AM + операторы |
pg_opfamily | семейство связанных opclass |
pg_amop | операторы семейства и их стратегии |
Узнать, какой AM поддерживает оператор:
SELECT DISTINCT am.amname
FROM pg_amop aop
JOIN pg_operator op ON op.oid = aop.amopopr
JOIN pg_opfamily f ON f.oid = aop.amopfamily
JOIN pg_am am ON am.oid = f.opfmethod
WHERE op.oprname = '@>';
-- gin, gist (не btree)
Несколько opclass на тип
CREATE INDEX ON t (email text_pattern_ops); -- под LIKE 'prefix%'
Обычный текстовый opclass сравнивает по локали, и LIKE 'abc%' им не
ускоряется; text_pattern_ops сравнивает побайтово - и префиксный LIKE
работает.
Поддержка ≠ использование
Даже если оператор поддержан, индекс не сработает, когда колонка под функцией - условие не sargable (см. sargability). Выбор типа индекса смотри в index-design, устройство B-tree - в btree-structure.