Как оптимизируешь запрос который долго выполняется

«Как оптимизируешь запрос который долго выполняется» — вопрос из категории SQL, который задают на 38% собеседований Продуктовый Аналитик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для оптимизации медленного SQL-запроса:

  1. Анализ плана выполнения (EXPLAIN ANALYZE) для выявления узких мест (full scans, сортировки, nested loops).
  2. Добавление индексов на поля в WHERE, JOIN, ORDER BY. Например:
CREATE INDEX idx_user_active ON users(is_active) WHERE is_active = true;
  1. Оптимизация JOIN - уменьшение таблиц перед соединением через подзапросы или CTE.
  2. Лимитирование данных - добавление LIMIT или фильтрация по датам.
  3. Переписывание сложных подзапросов на JOIN или временные таблицы.

Пример оптимизации:

-- Было
SELECT * FROM orders WHERE user_id IN (SELECT id FROM users WHERE signup_date > '2023-01-01');

-- Стало
WITH recent_users AS (
  SELECT id FROM users WHERE signup_date > '2023-01-01'
)
SELECT o.* FROM orders o JOIN recent_users u ON o.user_id = u.id;

Важно тестировать изменения на копии prod-данных и мониторить влияние на нагрузку БД.