DBAtlas · Атлас эксплуатации баз данных

Журналировать планы выполнения медленных запросов через auto_explain

PostgreSQLПроизводительность

Команда

-- 1) Per session: effective immediately, no restart (superuser)
LOAD 'auto_explain';
SET auto_explain.log_min_duration = '500ms';
SET auto_explain.log_analyze = on;
SET auto_explain.log_buffers = on;
SET auto_explain.log_timing = off;
SET auto_explain.log_nested_statements = on;

-- 2) Persistent: loaded by new sessions, a reload is enough.
--    The module must be LOADed in this session before ALTER SYSTEM accepts auto_explain.* parameters.
LOAD 'auto_explain';
ALTER SYSTEM SET session_preload_libraries = 'auto_explain';
ALTER SYSTEM SET auto_explain.log_min_duration = '2s';
ALTER SYSTEM SET auto_explain.log_analyze = on;
ALTER SYSTEM SET auto_explain.log_buffers = on;
ALTER SYSTEM SET auto_explain.log_timing = off;
ALTER SYSTEM SET auto_explain.sample_rate = 0.1;
SELECT pg_reload_conf();

Что делает

Записывает в журнал сервера план выполнения запросов, превышающих порог (с фактическим числом строк и данными о буферах при включённом log_analyze); фиксирует план, построенный с реальными параметрами приложения.

Когда использовать

Когда запрос медленный только из приложения или с определёнными параметрами и не воспроизводится ручным EXPLAIN; чтобы поймать периодические смены плана.

Внимание

log_analyze = on добавляет накладные расходы на инструментирование к каждому запросу в выборке, включая те, что ниже порога; log_timing = off и sample_rate < 1 уменьшают их. log_min_duration = 0 переполняет журнал в production. ALTER SYSTEM SET session_preload_libraries перезаписывает существующее значение; сначала проверьте SHOW session_preload_libraries. session_preload_libraries не влияет на существующие сессии; загрузка в каждом процессе требует shared_preload_libraries и перезапуска.

Открыть в DBAtlas →

Связанные материалы