# Sargability: почему индекс не используется _Индексы · PostgreSQL Knowledge Base_ **TL;DR:** Условие sargable, если индекс по колонке к нему применим. Каст или функция над колонкой (created::date, lower(email)) делают его не-sargable - индекс игнорируется, план уходит в Seq Scan. Лечение - переписать или индекс по выражению. «Индекс есть, а не используется» чаще всего значит, что условие не-sargable: колонка спрятана под функцией или кастом. ## Каст слева убивает индекс ```sql -- не-sargable: индекс по created не подходит → Seq Scan WHERE created::date = '2024-01-01' -- sargable: диапазон по самой колонке → индекс работает WHERE created >= '2024-01-01' AND created < '2024-01-02' ``` `created::date` оборачивает колонку в функцию; индекс построен по значениям `created`, а сравнивается результат приведения. ## Функция над колонкой - то же ```sql WHERE lower(email) = 'a@b.c' -- индекс по email не подходит ``` Два выхода: переписать без функции или индекс по выражению: ```sql CREATE INDEX ON users (lower(email)); ``` ## Sargability ортогональна operator class Даже если оператор поддержан методом доступа (см. [operator-classes](/courses/postgres/kb/operator-classes.md)), не-sargable условие индекс не использует. Сначала условие должно быть sargable (колонка не под функцией), потом оператор - в operator class. ## Как заметить В `EXPLAIN ANALYZE` - Seq Scan (см. [access-methods](/courses/postgres/kb/access-methods.md)) там, где ждёшь индекс, и большое расхождение estimated/actual rows. Типичные виновники: каст, функция, неявное приведение типа. Проектирование индексов - в [index-design](/courses/postgres/kb/index-design.md). ## Команды ```sql WHERE col >= d AND col < d + 1 ``` Sargable-диапазон вместо col::date = d ```sql CREATE INDEX ON t (lower(col)); ``` Индекс по выражению, когда условие по функции ## См. также - [Проектирование индексов](/courses/postgres/kb/index-design.md) - [Operator classes и выбор индекса](/courses/postgres/kb/operator-classes.md) - [B-tree: структура и спуск](/courses/postgres/kb/btree-structure.md) - [Методы доступа: Seq, Index, Bitmap, Index-Only](/courses/postgres/kb/access-methods.md)