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

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

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

SQL_PERF_DEGRADATION 1С:Предприятие и СУБД

Оптимизация запросов PostgreSQL: Анализ EXPLAIN (ANALYZE, BUFFERS)

Обновлено: 26.08.2026 · Официальная документация ↗
  • Резкий рост утилизации CPU и дискового I/O при выполнении сложных аналитических запросов.
  • Ошибки нехватки рабочей памяти temporary file: path ... size ... в логах СУБД.
  • Неоптимальный выбор планировщиком полного сканирования таблицы (Seq Scan) вместо использования индексов.

1. Получение детализированного плана выполнения

Запустите анализ запроса с выводом реального времени исполнения, потребления буферов памяти и ввода-вывода:

EXPLAIN (ANALYZE, BUFFERS, SETTINGS, TIMING, COSTS) 
SELECT o.id, o.created_at, c.name, SUM(i.price * i.quantity)
FROM orders o
JOIN customers c ON o.customer_id = c.id
JOIN order_items i ON i.order_id = o.id
WHERE o.created_at >= '2025-01-01'
GROUP BY o.id, o.created_at, c.name
ORDER BY o.created_at DESC
LIMIT 50;

2. Ключевые узлы и метрики для анализа

  • Buffers: shared hit vs readshared hit означает чтение из RAM-кэша PostgreSQL, read — чтение с физического диска. Большое значение read требует прогрева кэша или оптимизации выборки.
  • Rows Removed by Filter — неэффективный индекс: ядро читает блоки с диска и отбрасывает их на лету. Требуется композитный индекс.
  • Sort Method: external merge Disk — СУБД не поместила операцию сортировки в work_mem и сбросила временные данные во временный файл на диск.

3. Оптимизация рабочей памяти сессии для тяжелых сортировок

-- Увеличение памяти для текущей транзакции
SET work_mem = '128MB';

-- Проверка и обновление устаревшей статистики планировщика
ANALYZE VERBOSE orders;
ANALYZE VERBOSE order_items;
💡 Практика специалистов: Если план показывает узлы Hash Join или Sort с выводом 'Disk: xxxkB', увеличьте параметр work_mem, чтобы исключить медленный I/O во временные файлы на диске.

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

Выполняет ли EXPLAIN ANALYZE сам запрос физически?

Да. EXPLAIN ANALYZE выполняет запрос в СУБД на самом деле. Если выполнять его для команд INSERT, UPDATE или DELETE, данные в таблице будут модифицированы. Для безопасного теста оборачивайте запрос в блок BEGIN; ... ROLLBACK;.

Что означает разница между rows=1 (estimate) и actual rows=500000?

Это указывает на устаревшую статистику в системном каталоге pg_statistic или отсутствие расширенной статистики (CREATE STATISTICS) по зависимым колонкам. Планировщик ошибается при выборе алгоритма соединения.

Почему планировщик выбирает Seq Scan вместо Index Scan на большой таблице?

Если запрос запрашивает существенный процент строк таблицы (обычно > 10-20%), последовательное чтение блоков (Seq Scan) выполняется быстрее случайного позиционирования по индексу из-за предвыборки страниц ядром ОС.

Что показывает параметр shared dirtied и shared written?

shared dirtied отображает количество страниц shared buffers, которые были модифицированы данным запросом; shared written — сколько страниц сессия была вынуждена сбросить на диск самостоятельно.

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