暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL18中psql相关新特性尝鲜(1)

在PostgreSQL18中新增了不少psql的相关的新特性,说不准那个命令就可以帮助到你。我会通过几篇文章逐个的对每个psql进行测试说明,希望对大家以后得实施运维有所帮助。

元命令上使用扩展模型

在PostgreSQL18中允许在所有psql的元命令上使用扩展模式,这就允许将“x”添加到任何类似psql列表的元命令中,在输出的时候强制其以扩展模式显示,也就是可以把查询的结果行转换为列的形式展示,这中操作对于输出非常宽的情况下,可以提高显示内容的可读性。例如,“\dvx+”(或等价的“\dv+x”)将在扩展模式下生成一个视图列表,其中包含额外的详细信息。该功能适用于所有\d*元命令,加上\l、\z和\lo_list,但是有一个特殊命令,即扩展模式选项“x”不能单独附加到“\d”后面,因为“\dx”表示已经安装的扩展。

  1. demo-# \dvx+
  2. List of views
  3. -[ RECORD 1]-------------------
  4. Schema| bookings
  5. Name| aircrafts
  6. Type| view
  7. Owner| postgres
  8. Persistence| permanent
  9. Size|0 bytes
  10. Description|Aircrafts
  11. -[ RECORD 2]-------------------
  12. Schema| bookings
  13. Name| airports
  14. Type| view
  15. Owner| postgres
  16. Persistence| permanent
  17. Size|0 bytes
  18. Description|Airports

相比于之前的扩展模式的使用方式,非常的方便。唯一容易让我们忽略的就是上面提到的“\dx”。

\conninfo使用表格格式并包含更多信息

\conninfo是用于输出当前数据库连接的信息,如果使用TLS,则包括TLS相关信息。

在PostgreSQL18以前的版本来看看\conninfo的效果

  1. demo-# \conninfo
  2. You are connected to database "demo"as user "postgres" via socket in"/tmp" at port "5432".

该结果就是通过一段话来描述连接的信息,感觉还是不直观。

  1. postgres=# \conninfo
  2. ConnectionInformation
  3. Parameter|Value
  4. ----------------------+----------
  5. Database| postgres
  6. ClientUser| postgres
  7. SocketDirectory|/tmp
  8. ServerPort|5432
  9. Options|
  10. ProtocolVersion|3
  11. PasswordUsed|false
  12.  GSSAPI Authenticated|false
  13. Backend PID          |29333
  14.  TLS Connection|false
  15. Superuser| on
  16. HotStandby| off
  17. (12 rows)

而在PostgreSQL18时,使用表格来展示连接信息,不仅显示的更直观明了而且新增了更多的连接到信息。特别需要提到的是,目前没有显示“角色”和“会话授权”,如果PG开发者审核通过该功能,可能在后续版本添加。

\df+,\do+,\dAo+和\dC+输出新增了函数防漏字段标识

在PostgreSQL18 psql的\df+, \do+, \dAo+和\dC+输出新增了函数防漏字段标识,用于标识特定函数是否防泄漏,以及操作符和类型转换调用的底层函数是否防泄漏,该功能对于确定在security barrier视图或行级安全策略(row-level security policies)保护的表上执行查询时能否使用索引非常有用。

  1. postgres=# \df+
  2. List of functions
  3. Schema|Name|Result data type |Argument data types |Type|Volatility|Parallel|Owner|Security|Leakproof?|Access privileges |Language|Internal
  4. name |Description
  5. --------+------+------------------+---------------------+------+------------+----------+-------+----------+------------+-------------------+----------+----------
  6. -----+-------------
  7. (0 rows)

在输出的结果中,可以看到Leakproof?列,这个是因为psql元命令中的布尔列都是以”?“结束,这个知识点之前也没有留意到。

防泄漏相关信息参阅,官网文档 中文文档

\dP+中添加分区表的访问方法细节

在\dP+的输出中添加了分区表的访问方法字段,如果分区表或索引有设置访问方法,那么就在下该字段中显示设置的方法。在这里的访问方法就是建表语句中的USING method指定的内容,通常可以设置行存还是列存(如果有);当然如果是索引的话,可能取值就比较多了,比如btree、hash、gin等等。

  1. create table sales(
  2. sale_id serial,
  3. product_id int,
  4. sale_date date
  5. ) partition by range (sale_date)
  6. ;
  7. create table sales_2022 partition of sales for values from('2022-01-01') to ('2023-01-01');
  8. create table sales_2023 partition of sales for values from('2023-01-01') to ('2024-01-01');
  9. create table sales_2024 partition of sales for values from('2024-01-01') to ('2025-01-01');

执行\dP+看一下分区表的信息

  1. testdb=# \dP+
  2. List of partitioned relations
  3. Schema|Name|Owner|Type|Table|Access method |Total size |Description
  4. --------+-------+----------+-------------------+-------+---------------+------------+-------------
  5. public| sales | postgres | partitioned table |||0 bytes    |
  6. (1 row)

在上面\dP+元命令的输出中,相比之前版本,新增了Access method字段来表示访问方法的详细的信息。

WATCH_INTERVAL设置默认的\watch等待时间

在PostgreSQL18中的psql中添加变量WATCH_INTERVAL来设置默认的\watch等待时间,当没有指定WATCH_INTERVAL变量时,\watch等待查询的默认间隔为2秒。这将添加新的变量WATCH_INTERVAL,该变量用于设置默认间隔,使用户可以对其进行配置。

在之前的版本中也可以设置间隔时长,\watch [[i=]SEC]用于指定对应的sql每N秒重新运行一次查询,如果参数i未指定,则默认值为2。在这里i参数可以省略不写,即\watch N或\watch

  1. SELECT COUNT(*) FROM pg_stat_activity \watch 5

虽然之前的版本也可以设置,但是对于每个SQL都需要单独设置比较麻烦,因此在PostgreSQL18中使得\watch成为第一个具有用户可配置默认设置的命令。

  1. \set WATCH_INTERVAL 10
  2. testdb=# SELECT COUNT(*) FROM pg_stat_activity \watch
  3. Tue20May202503:57:36 PM CST (every 10s)

  4.  count
  5. -------
  6. 9
  7. (1 row)

  8. Time:0.958 ms
  9. Tue20May202503:57:46 PM CST (every 10s)

  10.  count
  11. -------
  12. 9
  13. (1 row)

  14. Time:1.423 ms
  15. Tue20May202503:57:56 PM CST (every 10s)

从执行的结果也可以看出是每10s执行一次上面的的语句。

如果想了解\watch的其他用法可以自行参考这篇文章PostgreSQL17允许psql的\watch在返回最小行数后停止

总结

本节先介绍PostgreSQL18新增的5个psql功能,就我个人而言,至少扩展模式和\watch还是有所帮助的。

参考

https://www.postgresql.org/docs/18/release-18.html

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=00f4c2959

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2355e5111

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=978f38c77

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bba2fbc62

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1a759c832

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1a759c832

– END / –

可以通过下面的方式联系我

  • 微信公众号:@墨竹札记
  • 墨天轮:@墨竹
  • 微信:wshf395062788
  • IFCLUB:@墨竹
  • PGFans:@墨竹

如果这篇文章为你带来了灵感或启发,就请帮忙点赞收藏转发;如果文章中不严谨或者错漏之处,请及时评论指正。非常感谢!


文章转载自开源软件联盟PostgreSQL分会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论