Оптимизация SQL: индексы, EXPLAIN, query plans

0 задач Лёгкие, средние, сложные С эталонными решениями Решение в браузере
Performance — то, что отличает Junior от Senior. Senior не просто пишет запрос — он читает EXPLAIN ANALYZE, понимает когда поможет индекс, а когда нужна материализация или пре-агрегация. На собесе: «этот запрос тормозит, почему?», «как ускорить агрегацию по 100 млн строк?», «почему индекс не используется?». Ключевые темы — план выполнения (hash, merge, nested loop join), sargability (функция на колонке убивает индекс), партиционирование, отказ от SELECT *, материализованные view и колоночные СУБД вроде ClickHouse для тяжёлой аналитики. 10 задач на оптимизацию: от чтения плана до переписывания медленного запроса.
Начать решать задачи →

Все задачи на «performance» (0)

FAQ: частые вопросы про performance

Что показывает EXPLAIN?

План выполнения запроса: какой алгоритм JOIN (hash, merge, nested loop), какие индексы используются, объём прочитанных строк. EXPLAIN ANALYZE дополнительно выполняет запрос и показывает реальное время и фактическое число строк — расхождение оценки с фактом часто и есть причина тормозов.

Когда нужен индекс?

На колонках, по которым часто фильтруют (WHERE) или джоинятся (ON). НЕ нужен на маленьких таблицах (до 10 тыс. строк) и при низкой селективности (boolean на 50/50). Лишние индексы замедляют запись.

Почему запрос с функцией в WHERE не использует индекс?

WHERE DATE(created_at) = ... или WHERE lower(email) = ... делают условие non-sargable: обычный индекс по колонке не подходит, идёт полный скан. Решение — переписать без функции на колонке (created_at в диапазоне) или создать индекс по выражению.

Как ускорить агрегацию по сотням миллионов строк?

Пре-агрегация (материализованная view или сводная таблица по расписанию), партиционирование по дате с pruning, колоночное хранилище (ClickHouse, агрегатные движки). На строковой СУБД полный пересчёт по 100 млн строк каждый раз — это всегда медленно.

Чем материализованная VIEW отличается от обычной?

VIEW — сохранённый запрос, выполняется каждый раз заново. MATERIALIZED VIEW — сохранённый результат, обновляется по расписанию или вручную: быстрое чтение ценой того, что данные могут устаревать между обновлениями.

Связанные темы SQL

Агрегации · JOIN-запросы · Оконные функции · CTE (Common Table Expressions) · Подзапросы · Работа с датами · Строковые функции · Условная логика

Открыть весь SQL-тренажёр (576 задач) →