tgoop.com/sqlhub/2127
Create:
Last Update:
Last Update:
Большинство разработчиков делают частичные индексы так:
CREATE INDEX idx_active_users ON users(id) WHERE active = true;
Но фишка в том, что partial index может радикально ускорить запросы, где фильтр стоит не в WHERE, а «прячется» в JOIN-условии. Оптимизатор всё равно понимает условие и использует индекс.
Например, у вас есть таблица logs, где 95% строк — архив, и только 5% актуальные. Запрос делает join:
SELECT u.id, l.event
FROM users u
JOIN logs l ON l.user_id = u.id AND l.is_archived = false;
Если делать обычный индекс, он будет огромный. Но partial index:
CREATE INDEX idx_logs_active ON logs(user_id)
WHERE is_archived = false;
Теперь:
- индекс в 20–30 раз меньше
- cache hit rate выше
- планы меняются с seq scan на index scan
- JOIN начинает работать почти как в in-memory базе
Прикольно, что работает даже если в SELECT самого условия нет — главное, чтобы оно было в ON.
Это отличный способ ускорять «холодные» большие таблицы, где часто обращаются только к маленькому активному сегменту.
@sqlhub
