Создание индекса для указанного SELECT‑запроса

Для фиксированного PostgreSQL-запроса подходит частичный индекс по created_at с указанным WHERE. Для меняющихся фильтров нужен компромисс между отбором и сортировкой.

Короткий ответ

Что ответить на собеседовании

Для фиксированного 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее