Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

PG_SLOW_QUERY_BAD_PLAN Linux / DevOps

Траблшутинг медленных запросов в PostgreSQL: чтение планов EXPLAIN ANALYZE BUFFERS

Обновлено: 24.08.2026
  • Резкое возрастание времени ответа API и загрузки процессоров сервера баз данных.
  • Ошибочный выбор плана планировщиком (выбор медленного Sequential Scan вместо Index Scan).
  • Существенное расхождение между предполагаемым количеством строк (rows=...) и фактическим (actual rows=...).

1. Получение полного аналитического плана запроса

EXPLAIN (ANALYZE, BUFFERS, SETTINGS, WAL)
SELECT o.id, o.total_amount, c.name
FROM orders o
JOIN customers c ON c.id = o.customer_id
WHERE o.status = 'COMPLETED'
  AND o.created_at >= '2023-11-01';

2. Ключевые маркеры проблем в плане EXPLAIN:

  • Seq Scan on table_name: полное сканирование таблицы. Требуется создание B-Tree / BRIN индекса.
  • Rows Removed by Filter: 1500000: прочитаны миллионы лишних страниц, индекс отсутствует или не покрывает условия.
  • Buffers: shared hit=12 read=45021: read указывает на физическое чтение медленного диска, hit — чтение из RAM.
  • Sort Method: external merge Disk: нехватка памяти work_mem для сортировки в памяти.

3. Устранение расхождений статистики планировщика

Если планировщик ошибается в оценке строк из-за устаревшей статистики:

-- Принудительный сбор свежей статистики
ANALYZE orders;

-- Увеличение детализации гистограммы для проблемной колонки
ALTER TABLE orders ALTER COLUMN status SET STATISTICS 500;
ANALYZE orders;

4. Включение расширения pg_stat_statements для профилирования

CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

-- Топ-5 запросов по суммарному времени выполнения
SELECT query, calls, total_exec_time, mean_exec_time, rows
FROM pg_stat_statements
ORDER BY total_exec_time DESC LIMIT 5;
💡 Практика специалистов: Всегда анализируйте вывод EXPLAIN вместе с параметром BUFFERS. Запрос может выполняться быстро в тестовой среде из-за горячего кэша (hit), но приведет к коллапсу на проде при миллионах операций shared read с диска.

Частые вопросы (FAQ)

В чем опасность выполнения EXPLAIN ANALYZE для команд DELETE или UPDATE?

EXPLAIN ANALYZE не просто планирует, но реально исполняет переданный SQL-запрос. Для операций модификации данных это приведет к реальному изменению или удалению строк (оборачивайте команду в транзакцию с ROLLBACK).

Что означает узел Bitmap Index Scan в плане?

Планировщик сканирует индекс, формирует битовую карту страниц в памяти, сортирует их по физическому расположению на диске и выполняет чтение таблицы последовательно, снижая random I/O.

Полезные материалы
Рекомендуем