Для фиксированного PostgreSQL-запроса подходит частичный индекс по created_at с указанным WHERE. Для меняющихся фильтров нужен компромисс между отбором и сортировкой.
Создание индекса для указанного SELECT‑запроса
Для фиксированного PostgreSQL-запроса подходит частичный индекс по created_at с указанным WHERE. Для меняющихся фильтров нужен компромисс между отбором и сортировкой.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Сформулируйте подходящий индекс, который оптимизирует выполнение следующего SQL‑запроса:
SELECT *
FROM employee
WHERE sex = 'm'
AND salary > 300000
AND age = 20
ORDER BY created_at;
Опишите, какие столбцы следует включить в индекс и в каком порядке, чтобы минимизировать количество чтений и ускорить сортировку результата.
Ответ
Для фиксированного PostgreSQL-запроса подходит частичный индекс по created_at с указанным WHERE. Для меняющихся фильтров нужен компромисс между отбором и сортировкой.
Если именно эти условия повторяются:
CREATE INDEX employee_matching_created_idx
ON employee (created_at)
WHERE sex = 'm' AND salary > 300000 AND age = 20;
В индексе только подходящие записи, уже упорядоченные по created_at. Использование зависит от того, сможет ли планировщик доказать соответствие предиката запросу; общий параметризованный план может не подойти.
Для разных значений рассмотрите (sex, age, salary): равенства перед диапазоном, но сортировка по created_at обычно остаётся. Вариант (sex, age, created_at) помогает порядку, однако salary становится дополнительным фильтром. Универсально лучшего индекса без статистики нет: сравните EXPLAIN (ANALYZE, BUFFERS) на реальной выборке. SELECT * обычно требует чтения самой таблицы.
Источник: www.postgresql.org.