postgresql 14新特性整理

       本文整理一些工作中可能会用到的PostgreSQL 14新特性,有删减,完整版请参考官方文档PostgreSQL: Documentation: 14: E.7. Release 14。

一、 Server

  • 新增预定义角色 pg_read_all_data 和 pg_write_all_data,授予 所有 tables, views, sequences的读、写权限
  • 新增预定义角色pg_database_owner ,包含当前db的owner权限,在临时数据库中特别有用

PostgreSQL: Documentation: 14: 22.5. Predefined Roles

  • 后台进程崩溃后,删除相关临时文件。之前版本会保留这些文件用于debug,可由remove_temp_files_after_crash参数控制
  • 如果客户端断开连接,允许长时间运行的SQL被取消(Allow long-running queries to be canceled if the client disconnects),由client_connection_check_interval参数控制
  • pg_terminate_backend()函数新增了可选的超时参数
  • 允许宽元组(wide tuples)总是被加入到近乎为空的heap page。在之前的版本,超出页的fill factor参数后,元组会被插入到新页

1. Vacuum

  • 当索引中可清理的entries非常少,vacuum可以跳过这些index提高速度,该功能由INDEX_CLEANUP参数控制
  • 允许vacuum更迫切地将被删除的btree page加入fsm文件,之前版本只能将被上次vacuum标记为deleted的页加入fsm文件(14版本则是本次vacuum标记的也可以)。
  • 允许vacuum回收无用的尾部堆指针(trailing heap line pointers)
  • 允许vacuum在CREATE INDEX CONCURRENTLY,REINDEX CONCURRENTLY等minimal-locking index操作时清理死元组
  • 加速对有非常多表的db的vacuum操作
  • 减小vacuum_cost_page_miss的默认值,以更好地反应当前硬件能力
  • 新增跳过vacuum TOAST 表的能力,VACUUM新增了PROCESS_TOAST选项,而vacuumdb新增了--no-process-toast选项
  • COPY FREEZE可以在导入数据时相应更新页的可见性bit
  • Vacuum操作在表的xid或multixact 接近回卷时会更激进,由vacuum_failsafe_age和vacuum_multixact_failsafe_age参数控制
  • 增加了xid或multixact 接近回卷时的告警时间
  • 在autovacuum logging output中增加了每个索引(per-index)信息

2. 分区

  • 提升了具有大量分区的分区表的update和delete性能
  • 可以在线进行detach操作 ALTER TABLE ... DETACH PARTITION ... CONCURRENTLY, and FINALIZE
  • 分区边界值忽略COLLATE子句

3. 索引

  • btree索引可以删除过期的index entries,避免页分裂,防止频繁更新的索引快速膨胀
  • BRIN索引(Block Range Index)可以在每个range记录多个 min/max values 
  • PostgreSQL黑科技BRIN索引 - 墨天轮
  • BRIN索引可以使用bloom filters 
  • GiST索引可以在创建过程中预排序数据
  • SP-GiST索引可以使用include子句包含列

4. 优化器

  • in子句包含大量常量时,可以用hash查找(以前只能顺序扫描值列表)
  • or子句、表达式也可以使用扩展统计信息,可以查询pg_stats_ext_exprs视图
  • 更高效的TIDs堆范围扫描
  • 修复EXPLAIN CREATE TABLE AS 和 EXPLAIN CREATE MATERIALIZED VIEW的问题,之前如果对象已存在,则会报错

5. 通用性能

  • 提升了系统在有大量CPU和高连接数时计算MVCC可见性快照的速度,也提升了有大量空闲会话时的性能
  • 新增执行器方法以记录nested-loop join内侧的结果集(如果内侧结果集小效果会更好),由enable_memoize参数配置是否启用
  • 允许窗口函数使用增量排序
  • 提升了并行顺序扫描的IO性能
  • 允许查询引用多个外部表,以实现外部表并行扫描,postgres_fdw需要设置async_capable参数
  • 允许analyze命令做page prefetching ,由maintenance_io_concurrency参数控制
  • 提升正则表达式查询性能
  • 极大提升了Unicode normalization性能
  • TOAST 数据新增了LZ4压缩算法,编译pg时必须指定--with-lz4

6. 监控

  • 如果设置了compute_query_id参数,将在pg_stat_activity, EXPLAIN VERBOSE, csvlog, log_line_prefix中展示查询id  PostgreSQL 14数据库监控和日志功能的加强 - abce - 博客园
  • 如果设置了track_io_timing参数,将在 auto-vacuum 和auto-analyze 中记录IO时间,并在auto-analyze 中记录buffer read和脏读占比
  • 在log_connections输出中增加客户端原始用户名

7. 系统视图

  • 新增pg_stat_progress_copy 视图记录COPY进度
  • 新增pg_stat_wal视图记录WAL活动

postgresql 14新特性整理_第1张图片

  • 新增pg_stat_replication_slots 视图记录复制槽活动
  • 新增pg_backend_memory_contexts 视图记录会话内存使用情况

postgresql 14新特性整理_第2张图片

  • 新增pg_log_backend_memory_contexts()函数输出arbitrary backends内存上下文使用情况
  • pg_stat_database视图新增会话状态

  • pg_prepared_statements视图新增generic 和custom plan 计数

postgresql 14新特性整理_第3张图片

  • pg_locks 视图新增锁等待开始时间 waitstart
  • pg_stat_activity视图可以看到归档进程信息
  • 新增等待事件WalReceiverExit,表示WAL receiver退出的等待时间

8. 验证连接

  • pg_hba.conf 和pg_ident.conf记录可以跨多行
  • 密码允许使用任意长度

9. 参数设置

  • 新增idle_session_timeout参数关闭空闲连接,跟idle_in_transaction_session_timeout的区别是会话不需要开启事务,只判断空闲超时
  • checkpoint_completion_target 默认值调整为 0.9,之前是0.5
  • log_line_prefix可以使用%P,表示parallel group leader's PID
  • 新增huge_page_size参数,控制Linux大页使用的size

二、 流复制与恢复

  • 允许使用pg_rewind回退从库(之前不是也可以?)
  • restore_command 参数在 server reload后生效
  • 新增log_recovery_conflict_waits参数,报告超长的恢复冲突等待时间
  • 如果主库修改的参数阻止了从库replay,从库将暂停恢复操作(之前从库会立刻关闭)
  • 新增pg_get_wal_replay_pause_state() 函数报告recovery状态,信息比pg_is_wal_replay_paused()更丰富
  • 新增只读服务器参数in_hot_standby ,使客户端更容易检测到自己连接的是不是从库
  • 加快有大shared buffers的数据库recovery期间小表的truncate速度
  • 新增pg_xact_commit_timestamp_origin() 函数,返回特定事务的提交时间
  • 新增pg_last_committed_xact()函数,返回复制源事务信息
  • 复制源函数可以使用标准函数的权限控制(之前只有超级用户能执行)

1. 逻辑复制

目前没有用到过这块,略

2. SELECT,INSERT

  • 减少不使用AS则不能用作列标签的关键字数量(减少了90%)
  • 允许为JOIN的USING子句指定别名(在USING后使用AS指定)
  • 允许将DISTINCT添加到GROUP BY删除重复的GROUPING SET组合,例如 GROUP BY CUBE (a,b), CUBE (b,c),如果不使用DISTINCT将会有重复数据
  • 正确处理INSERT多行VALUES时的DEFAULT值,过去常常报错
  • 为CTE添加SQL标准 SEARCH和CYCLE子句
  • WHERE允许子句中的列名ON CONFLICT是表限定的,但是只能引用目标表

3. 命令使用

  • 允许REFRESH MATERIALIZED VIEW使用并行
  • 允许REINDEX更改新索引的表空间
  • 允许REINDEX处理分区表的所有子表和索引
  • 索引CONCURRENTLY不需要再等待其他命令的CONCURRENTLY(不相互阻塞)
  • 提高COPY FROM二进制模式的性能
  • GRANT 和 REVOKE新增了SQL标准子句GRANTED BY
  • CREATE TRIGGER 新增了OR REPLACE 选项
  • 允许TRUNCATE外部表,postgres_fdw模块也支持
  • 允许更轻松地向订阅添加和删除发布  ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION
  • 将主键、唯一约束和外键添加到system catalogs

4. 数据类型

  • 允许扩展和内置数据类型实现下标,之前只能用于数组类型
  • 允许订阅JSONB类型数据
  • 添加对多范围数据类型(multirange data types)的支持

5. 函数

  • 允许函数和存储过程使用标准SQL
  • 存储过程新增OUT参数
  • 允许一些数组函数操作混合数据类型,例如 array_append(), array_prepend()等等
  • 新增数组截取函数trim_array(),参考PostgreSQL: Documentation: 14: 9.19. Array Functions and Operators
  • 新增bytea函数,等于ltrim() 和rtrim() ,即去除左右空格
  • split_part()函数支持负数下标,参考PostgreSQL: Documentation: 14: 9.4. String Functions and Operators
  • 新增string_to_table() 函数,将字符串拆分并转换为表,参考PostgreSQL: Documentation: 14: 9.4. String Functions and Operators
  • substring() 函数新增语法  SUBSTRING(text SIMILAR pattern ESCAPE escapechar)

三、 客户端与服务端工具

1. 客户端应用

  • vacuumdb新增--no-index-cleanup 和--no-truncate选项,支持跳过索引清理和truncate
  • pg_dump新增—extension选项,导出特定插件
  • pg_dump, pg_dumpall和pg_restore新增 –v选项,输出详细过程
  • psql使用\df和\do可以查看特定函数参数类型
  • psql使用\dt和\di可以查看TOAST 表和索引类型
  • psql使用\dX可以查看扩展统计信息对象

2. 服务端

  • 新增命令行工具pg_amcheck 用于检查数据损坏,简化在大量表上运行contrib/amcheck的操作。另外amcheck插件之前只能检查B-Tree索引页,pg 14中支持了检查heap pages 
  • pg_upgrade 删除了analyze_new_cluster 脚本,在vacuumdb有类似的操作
  • postmaster 删除了-o选项

四、 过时参数和特性

  • 删除参数 vacuum_cleanup_index_scale_factor,该参数设置从13.3版本开始被忽略
  • 删除参数 operator_precedence_warning ,该参数设置从9.5版本开始会有警告

postgresql 14新特性整理_第4张图片

tsearch2 compatibility wrapper 是个插件

参考:

PostgreSQL: Documentation: 14: E.7. Release 14

PostgreSQL: Feature Matrix

https://cloud.tencent.com/developer/article/1940899

你可能感兴趣的:(PostgreSQL,新特性,数据库,postgresql,pg,14,新特性)