SQLLab
Справочник/Индексы/Partial Index (частичный индекс)
ИндексыПродвинутый

Partial Index (частичный индекс)

Индекс с условием WHERE — индексирует только часть строк таблицы.

Синтаксис
CREATE INDEX idx_name ON table (column) WHERE condition;

Объяснение

Частичный индекс меньше по размеру и быстрее обновляется, чем полный. Идеален когда запросы всегда фильтруют по одному условию. Пример: таблица orders с 10 млн строк, из которых активных (status='pending') всего 1000. Полный индекс на status — почти бесполезен. Частичный — только для pending — маленький и эффективный.

Пример

-- Только активные пользователи
CREATE INDEX ON users (email) WHERE is_active = true;

-- Незакрытые задачи
CREATE INDEX ON tasks (assigned_to, due_date)
WHERE status != 'done';

Анекдоты по теме

— Почему UUID медленнее INT как первичный ключ? — UUID случайный — вставки разбросаны по всему индексу. — INT последовательный — всегда в конец. — Насколько медленнее? — На больших таблицах B-tree страницы постоянно разбиваются. В разы медленнее INSERT. — Решение? — UUID v7 (упорядоченный по времени) или ULID — случайные, но монотонные.

— Что такое seq_page_cost и random_page_cost? — Параметры PostgreSQL для оценки стоимости I/O. — По умолчанию random_page_cost = 4.0 (в 4 раза дороже seq). — На SSD? — Лучше поставить 1.1–1.5. Оптимизатор будет чаще использовать индексы. — Это действительно меняет планы? — Значительно.

Оптимизатор запросов говорит медленному подзапросу: — Ты почему такой тормоз? Подзапрос (ковыряя IN (SELECT ...)): — Я каждую строчку с каждой сравниваю. Зато честно. Оптимизатор: — Используй EXISTS. Подзапрос, помолчав: — Так я не знаю, существую ли я на самом деле после этого...