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_statementcontextsuperuserのパラメータであるため、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_statement0を指定すると、実行時間にかかわらずすべての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_sizelog_rotation_ageによるログローテーションの設定もあわせて確認しておくとよい。