PostgreSQL17允许psql的\watch在返回最小行数后停止
PostgreSQL17允许psql的\watch在返回最小行数后停止
今天看看PostgreSQL17对psql中 \watch的优化改进。在psql中使用\watch运行重复查询时,当查询不再返回预期的行数时,可以停止监控进程,例如,监视pg_stat_activity中某个事件的存在并在该事件不再存在时停止。在PostgreSQL17版本中,为\watch添加min_rows=MIN参数,该参数可以设置为非负整数,并且当返回的行数少于MIN时,watch查询将停止执行。在这里min_rows可以简写为n,后面也将验证。
psql中\watch参数说明
\watch [[i=]SEC] [c=N] [m=MIN]
execute query every SEC seconds, up to N times,
stop if less than MIN rows are returned
--每SEC执行一次查询,最多N次,如果返回的行数少于MIN则停止
\watch每隔多久执行一次
\watch [[i=]SEC]用于指定对应的sql每N秒重新运行一次查询,如果参数I未指定,则默认值为2。在这里i参数可以省略不写,即\watch N或\watch
testdb=# SELECT COUNT(*) FROM pg_stat_activity \watch 1
Tue 30 Jul 2024 03:59:57 PM CST (every 1s)
count
-------
6
(1 row)
Tue 30 Jul 2024 03:59:58 PM CST (every 1s)
count
-------
6
(1 row)
Tue 30 Jul 2024 03:59:59 PM CST (every 1s)
count
-------
6
(1 row)
在指定\watch 1命令后,执行SELECT COUNT(*) FROM pg_stat_activity语句,然后休眠1s后再重复执行该SQL。
\watch 最多执行几次
当我们指定c=2时,在执行2次后就停止执行了。
testdb=# SELECT COUNT(*) FROM pg_stat_activity \watch 1 c=2
Tue 30 Jul 2024 04:21:20 PM CST (every 1s)
count
-------
6
(1 row)
Tue 30 Jul 2024 04:21:21 PM CST (every 1s)
count
-------
6
(1 row)
testdb=#
\watch 指定返回最小行数后停止–新功能
在监控数据库时运行情况时,比如监控正在运行的SQL或锁时,这个是相当有用。
我们先在本地打开两个客户端分别psql连接数据库,然后在其中一个客户端上,执行下面的查询语句
testdb=# SELECT pid FROM pg_stat_activity WHERE backend_type = 'client backend' \watch m=2
Tue 30 Jul 2024 04:10:51 PM CST (every 2s)
pid
-------
11367
11626
(2 rows)
Tue 30 Jul 2024 04:10:53 PM CST (every 2s)
pid
-------
11367
11626
(2 rows)
在第二个客户端窗口中执行\q或者关闭客户端也可以
Tue 30 Jul 2024 04:13:51 PM CST (every 2s)
pid
-------
11367
11626
(2 rows)
Tue 30 Jul 2024 04:13:53 PM CST (every 2s)
pid
-------
11367
(1 row)
当我们关闭第二个窗口时,可以看到第一个客户端页面,当查询返回的行数为1,小于了指定的条件2,因此就终止了该查询。
验证m为min_rows的简写
在官方的邮件中,我们看到的介绍是为\watch添加min_rows=MIN参数,但是psql的帮助界面显示参数语法为m,出于严谨的态度,我们顺便也验证看一下,m是否为min_rows的简写?
testdb=# SELECT pid FROM pg_stat_activity WHERE backend_type = 'client backend' \watch min_rows=2
Tue 30 Jul 2024 04:33:57 PM CST (every 2s)
pid
-------
11367
11933
(2 rows)
当把参数由m=2替换为min_rows=2,可以正常执行且执行的效果是一样的,也就说明了m=2是min_rows=的简写。
总结
到此,我们就把\watch命令的功能都验证了,在执行的SQL后面添加\watch命令,可以指定该SQL多久执行一次查询,最多N次,如果返回的行数少于MIN则停止。