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の場合は実際の行数とバッファデータ付き)。アプリケーションの実際のパラメータで生成された計画を取得できる。

使用する場面

クエリがアプリケーションから、または特定のパラメータでのみ遅く、手動の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 で開く →

関連項目