DEV Community

Dmitry Romanoff
Dmitry Romanoff

Posted on

PostgreSQL parameter log_min_duration_statement

The log_min_duration_statement is configuration parameter of PostgreSQL.

It sets the minimum execution time in milliseconds (ms) above which all statements will be logged.

The default value for the log_min_duration_statement parameter is -1, which disables logging statements.

Setting the PostgreSQL parameter log_min_duration_statement to 0 will prints all statements durations.

Note. Setting this parameter on Production environments can lead to high volume of logs and significant disk storage allocation.

Usage Examples.

Assume I have created table abc:

postgres=# \d abc
                Table "public.abc"
 Column |  Type  | Collation | Nullable | Default
--------+--------+-----------+----------+---------
 a      | bigint |           |          |

postgres=#
Enter fullscreen mode Exit fullscreen mode

and populated it with data:

postgres=# insert into abc SELECT * FROM generate_series(1,10000000);
INSERT 0 10000000
Enter fullscreen mode Exit fullscreen mode

#1 Example. How to log all the queries that take more than 1ms?

postgres=# set log_min_duration_statement=1;
SET
postgres=# show log_min_duration_statement;
 log_min_duration_statement
----------------------------
 1ms
(1 row)

postgres=# insert into abc values(1);
INSERT 0 1
postgres=# insert into abc values(2);
INSERT 0 1
postgres=# insert into abc values(3);
INSERT 0 1
postgres=# select count(1) from abc;
  count
----------
 10000003
(1 row)

postgres=#
Enter fullscreen mode Exit fullscreen mode

PostgreSQL log file (fragment):

...
2023-03-11 17:20:27.262 UTC [119] LOG:  duration: 5.477 ms  statement: insert into abc values(1);
2023-03-11 17:20:29.281 UTC [119] LOG:  duration: 8.656 ms  statement: insert into abc values(2);
2023-03-11 17:20:34.151 UTC [119] LOG:  duration: 7.263 ms  statement: insert into abc values(3);
2023-03-11 17:20:40.473 UTC [119] LOG:  duration: 336.449 ms  statement: select count(1) from abc;
...
Enter fullscreen mode Exit fullscreen mode

#2 Example. How to disable logging statements?

postgres=# set log_min_duration_statement=-1;
SET
postgres=# show log_min_duration_statement;
 log_min_duration_statement
----------------------------
 -1
(1 row)

postgres=# select count(1) from abc;
  count
----------
 10000003
(1 row)

postgres=# insert into abc values(2);
INSERT 0 1
postgres=#
Enter fullscreen mode Exit fullscreen mode

PostgreSQL log file (fragment):

There is no information about the queries.

#3 Example. How to log all the queries that take more than 100ms?

postgres=# set log_min_duration_statement=100;
SET
postgres=# show log_min_duration_statement;
 log_min_duration_statement
----------------------------
 100ms
(1 row)

postgres=# select count(1) from abc;
  count
----------
 10000006
(1 row)

postgres=# insert into abc values(5);
INSERT 0 1

postgres=# select count(1) from abc where a > 10234;
  count
---------
 9989768
(1 row)

postgres=# insert into abc values(2);
INSERT 0 1
Enter fullscreen mode Exit fullscreen mode

PostgreSQL log file (fragment):

...
2023-03-11 17:18:50.287 UTC [119] LOG:  duration: 301.261 ms  statement: select count(1) from abc;
2023-03-11 17:18:54.134 UTC [119] LOG:  duration: 388.595 ms  statement: select count(1) from abc where a > 10234;
...
Enter fullscreen mode Exit fullscreen mode

Top comments (1)

Collapse
 
martin_hagen_af03576e0ffe profile image
Martin Hagen

Does this time also include network time to the client, or is it just the time spend on the server (parsing, planning, executing..)?