Поиск и исправление медленных запросов
Используйте 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 — локальная установка не требуется.
Все уроки этого курса
- Чтение EXPLAIN и EXPLAIN ANALYZE
- Последовательное сканирование и сканирование по индексу
- Хеш-соединение, соединение слиянием и вложенный цикл
- Поиск и исправление медленных запросов