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가 on이면 실제 행 수와 buffer 데이터 포함). 애플리케이션의 실제 파라미터로 생성된 계획을 포착한다.

사용 시점

쿼리가 애플리케이션에서 또는 특정 파라미터로만 느리고 수동 EXPLAIN으로 재현할 수 없을 때. 간헐적인 계획 변경을 포착하기 위해.

주의

log_analyze = on은 임계값 미만을 포함한 모든 샘플 쿼리에 계측 오버헤드를 추가한다. log_timing = off와 sample_rate < 1로 줄일 수 있다. log_min_duration = 0은 운영 환경에서 로그를 넘치게 한다. ALTER SYSTEM SET session_preload_libraries는 기존 값을 덮어쓰므로 먼저 SHOW session_preload_libraries를 확인한다. session_preload_libraries는 기존 세션에 영향을 주지 않으며, 모든 프로세스에 로드하려면 shared_preload_libraries와 재시작이 필요하다.

DBAtlas에서 열기 →

관련 항목