0Pricing
SQL Academy · Урок

Поиск и исправление медленных запросов

Используйте pg_stat_statements, log_min_duration_statement и EXPLAIN, чтобы находить медленные запросы и применять точечные исправления

«Поиск и исправление медленных запросов» — бесплатный урок SQL Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Шаг 1: найдите медленные запросы

Не оптимизируйте вслепую. Используйте:

  • pg_stat_statements — самые затратные запросы по суммарному времени
  • log_min_duration_statement — журналирование запросов, выполняющихся дольше порога
  • pgBadger — удобные отчёты из журналов

Настройка pg_stat_statements

Включите расширение и настройте shared_preload_libraries:

-- postgresql.conf
shared_preload_libraries = 'pg_stat_statements'

-- After restart:
CREATE EXTENSION pg_stat_statements;

10 самых тяжёлых запросов

Самый полезный запрос для любого DBA:

SELECT query,
       calls,
       total_exec_time,
       mean_exec_time,
       rows
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;

Журналирование медленных запросов

Задайте порог и прочитайте журнал:

-- postgresql.conf
log_min_duration_statement = '500ms'
-- All queries running > 500ms are logged.

Шаг 2: воспроизведите с помощью EXPLAIN ANALYZE

Для каждого медленного запроса выполните EXPLAIN ANALYZE в репрезентативной среде с данными, похожими на рабочие. Обратите внимание на:

  • Узел с наибольшим фактическим временем
  • Наибольшую разницу между оценочным и фактическим числом строк
  • Используются ли подходящие индексы

Распространённые исправления

  • Отсутствующий индекс для столбца WHERE / JOIN
  • Непригодный для индекса предикат (функция над столбцом) — добавьте индекс по выражению или перепишите запрос
  • Устаревшая статистика — выполните ANALYZE
  • Неправильный тип данных (вызывающий неявное приведение) — исправьте тип столбца
  • Условия OR — перепишите как UNION из запросов с одним условием
  • SELECT * извлекает слишком много данных — сузьте проекцию

Устаревшая статистика

Если оценочное и фактическое число строк сильно различаются, сначала выполните ANALYZE:

ANALYZE orders;
-- Or rely on autovacuum to do it periodically.

Проверка индексов

Выведите список индексов таблицы и их размеров:

SELECT indexrelname, pg_size_pretty(pg_relation_size(indexrelid))
FROM pg_stat_user_indexes
WHERE relname = 'orders'
ORDER BY pg_relation_size(indexrelid) DESC;

Неиспользуемые индексы

Найдите индексы, которые никогда не используются:

SELECT schemaname, relname, indexrelname, idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;
-- Consider dropping them — they slow writes for no read benefit.

Конфликты блокировок

Иногда запрос кажется «медленным», потому что он ждёт блокировку. Проверьте pg_stat_activity на наличие wait_event:

SELECT pid, state, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE state <> 'idle';

Шаблоны переписывания запросов

  • Перенесите фильтры в WHERE
  • Замените коррелированный подзапрос в SELECT на JOIN + GROUP BY
  • Замените OR на UNION ALL из индексируемых запросов
  • Используйте оконные функции вместо самосоединений
  • Материализуйте повторяющиеся подзапросы с помощью общих табличных выражений (если планировщик запутался)

Повторяйте

Настройка производительности — это цикл: измерьте → выдвиньте гипотезу → измените → измерьте. Не гадайте.

Итоги

Находите медленные запросы с помощью pg_stat_statements, диагностируйте с помощью EXPLAIN ANALYZE, исправляйте индексами / ANALYZE / переписыванием и повторяйте.

Быстрая проверка

Какое расширение PostgreSQL показывает запросы, суммарно затрачивающие больше всего времени?

Часто задаваемые вопросы

Урок «Поиск и исправление медленных запросов» бесплатный?

Да — полный текст урока «Поиск и исправление медленных запросов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «Поиск и исправление медленных запросов»?

Используйте pg_stat_statements, log_min_duration_statement и EXPLAIN, чтобы находить медленные запросы и применять точечные исправления Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Поиск и исправление медленных запросов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Чтение EXPLAIN и EXPLAIN ANALYZE
  2. Последовательное сканирование и сканирование по индексу
  3. Хеш-соединение, соединение слиянием и вложенный цикл
  4. Поиск и исправление медленных запросов
← Назад к SQL Academy