Короткий ответ
Partial index — это индекс, построенный только для строк, удовлетворяющих условию WHERE, указанному при его создании; его применяют, когда запросы почти всегда фильтруют по одному и тому же подмножеству строк (например, только активные записи), чтобы индекс был меньше и быстрее полного.
Как это работает подробнее
При создании CREATE INDEX ... WHERE condition PostgreSQL включает в индекс только строки, удовлетворяющие condition, и поддерживает это условие при последующих INSERT/UPDATE; планировщик использует такой индекс только для запросов, чьё условие WHERE логически покрывается условием индекса.
Пример кода
example.sql
CREATE INDEX idx_tasks_active ON tasks(assignee_id) WHERE status = 'active';
-- Использует partial index
EXPLAIN SELECT * FROM tasks WHERE status = 'active' AND assignee_id = 10;
-- Не использует этот индекс (условие не совпадает)
EXPLAIN SELECT * FROM tasks WHERE status = 'in_progress' AND assignee_id = 10;Что использовать на практике
- Практика. Типичный кейс — таблица задач с большинством завершённых записей: CREATE INDEX ... WHERE status != 'done' резко уменьшает размер индекса по сравнению с полным индексом на всю таблицу.
Подводные камни
- Ошибка. Пишут запрос с условием, которое СУБД не может сопоставить с условием partial-индекса буквально (например, индекс WHERE status = 'active', а запрос использует WHERE status IN ('active')), из-за чего планировщик может не применить индекс.