linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/kb/Индексы/operator-classes

kb/indexes ── Индексы ── advanced

Operator classes и выбор индекса

Индекс работает не «на колонке», а для конкретных операторов над ней. Связь тип+оператор+метод доступа задаёт operator class. Через каталог pg_amop можно узнать, какой AM поддерживает оператор: @> знают gin и gist, не btree.

view as markdownaka: operator-class, opclass, text-pattern-ops

Индекс - для операторов

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_opclassoperator class: тип + AM + операторы
pg_opfamilyсемейство связанных opclass
pg_amopоператоры семейства и их стратегии

Узнать, какой AM поддерживает оператор:

sql
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 на тип

sql
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.

§ команды

bash
SELECT amname FROM pg_am;

Список методов доступа

bash
CREATE INDEX ON t (col text_pattern_ops);

Индекс под LIKE 'prefix%' (побайтовое сравнение)

§ см. также

  • btree-structureB-tree: структура и спускB-tree - сбалансированное дерево из 8-КБ страниц: meta page указывает на корень, внутренние страницы хранят разделители и downlink, листья - ключ и ctid. Большой fanout даёт 3-4 уровня на миллиарды строк.
  • sargabilitySargability: почему индекс не используетсяУсловие sargable, если индекс по колонке к нему применим. Каст или функция над колонкой (created::date, lower(email)) делают его не-sargable - индекс игнорируется, план уходит в Seq Scan. Лечение - переписать или индекс по выражению.
  • index-designПроектирование индексовИндекс - отсортированный список. Составной (a,b,c) работает по префиксу слева направо, не по средней колонке. Покрывающие (INCLUDE), частичные (WHERE) и по выражению сужают работу; лишние индексы - налог на запись.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки