log_min_duration_statementとは
log_min_duration_statementは、指定した時間(ミリ秒)以上かかったSQL文をログに出力するPostgreSQLのパラメータである。
スロークエリを特定する際に使用する。
デフォルト値は-1で、この場合はログ出力が無効になる。
SHOW log_min_duration_statement;
log_min_duration_statement
-----------------------------
-1
(1 row)
一時的に設定する
セッション単位で一時的に設定するにはSETコマンドを使用する。log_min_duration_statementはスーパーユーザー権限が必要なパラメータであるため、一般ユーザーでは変更できない。
SET log_min_duration_statement = 200;
上記の例では、200ミリ秒以上かかったSQL文がログへ出力される。
300ミリ秒かかるクエリを実際に実行すると、以下のようにログに出力される。
2026-07-25 13:47:01.334 UTC [78] LOG: duration: 306.623 ms statement: SELECT pg_sleep(0.3);
SETによる変更はセッション内でのみ有効であり、セッション終了とともに元の値に戻る。
恒久的に設定する
サーバー全体の設定として恒久的に変更するには、postgresql.confに以下のように記述する。
log_min_duration_statement = 500
稼働中のサーバーに対してはALTER SYSTEMコマンドでも設定できる。
ALTER SYSTEM SET log_min_duration_statement = 500;
SELECT pg_reload_conf();
log_min_duration_statementはcontextがsuperuserのパラメータであるため、pg_reload_conf()で設定を再読み込みするだけで反映され、サーバーの再起動は不要である。
SELECT name, setting, unit, context
FROM pg_settings
WHERE name = 'log_min_duration_statement';
name | setting | unit | context
-----------------------------+---------+------+-----------
log_min_duration_statement | 500 | ms | superuser
(1 row)
0を指定するとすべてのSQL文をログに出力する
log_min_duration_statementに0を指定すると、実行時間にかかわらずすべてのSQL文がログに出力される。
SET log_min_duration_statement = 0;
SELECT 1;
2026-07-25 13:47:10.736 UTC [84] LOG: duration: 0.104 ms statement: SELECT 1;
開発環境でSQL文の発行状況を細かく調査する場合に有用である。ただし本番環境で常時有効にすると、ログの出力量が急増するため注意して運用する。
運用時の注意点
log_min_duration_statementを短い値に設定するほど、ログに出力されるSQL文が増える。
ログの出力自体にもI/Oコストがかかるため、値を小さくしすぎるとサーバー負荷が上がる原因になる。
スロークエリの傾向をある程度把握したうえで、まずは数百ミリ秒程度のしきい値から始め、必要に応じて調整するとよい。
ログファイルの肥大化を防ぐため、log_rotation_sizeやlog_rotation_ageによるログローテーションの設定もあわせて確認しておくとよい。
