PolarDB PostgreSQL版兼容PostgreSQL 16的版本正式发布上线。PostgreSQL 16版本在性能方面有显著提升,尤其在并行查询、大数据量加载和逻辑复制等场景有重要改进。该版本为开发人员和管理员提供了许多新功能,包括更多的SQL/JSON语法,新的工作负载监控指标以及定义更灵活的集群间访问控制规则。
版本介绍
在社区PostgreSQL 16基础上,PolarDB还支持一些独有的功能,例如时空引擎Ganos、全局计划缓存以及GBK/GB18030字符集等。在PolarDB PostgreSQL版 16的第一个发布版本中,即支持以下插件:hll
、hypopg
、log_fdw
、pase
、pg_bigm
、pg_cron
、pg_jieba
、pg_repack
、pg_similarity
、pgtap
、pgvector
、pldebugger
、prefix
、roaringbitmap
、rum
、varbitx
、zhparser
、ganos
。
同时,PolarDB进行了深入的性能优化,例如通过指令集优化(SIMD/原子操作)、系统级优化(PGO/BOLT/LTO)和IO性能优化等手段实现深入性能优化。
相关文档:PostgreSQL 16社区发布公告。
发布时间
北京时间2024年9月18日
费用说明
支持包年包月和按量计费两种计费模式,可叠加计算包、存储包使用,提供灵活的计费选择。计费详情请参见产品计费。
关键提升
性能提升
PostgreSQL 16引入新的查询规划器,提升现有PostgreSQL功能的性能。
支持并行执行
FULL
和RIGHT
连接。为聚合函数(包含
DISTINCT
或ORDER BY
子句)查询生成更优的执行计划。支持使用增量排序处理SELECT DISTINCT查询。
优化窗口函数,使相关查询执行更加高效。
改进
RIGHT
和OUTER
“反连接(anti-joins)”,支持识别出不在已连接表中的数据行。
该版本对使用COPY
进行批量加载的单一和并发操作进行改进,测试显示在某些情况下性能提升高达300%。PostgreSQL 16增加了对使用libpq
的客户端的负载均衡支持。改进Vacuum策略,减少全表冻结的必要性。此外,PostgreSQL 16引入了在x86和ARM架构上使用SIMD
进行CPU加速,从而在处理ASCII和JSON字符串以及执行数组和子事务搜索时,提升性能。
逻辑复制
逻辑复制支持将数据流复制到其他可以解析PostgreSQL逻辑复制协议的节点或订阅者。PostgreSQL 16支持从Standby节点执行逻辑复制,即Standby节点可以将逻辑变更发布到其他服务器。这为开发者提供了新的工作负载分布选项,例如,使用Standby节点取代高负载主节点,通过逻辑复制将数据变更应用到下级订阅端。
此外,PostgreSQL 16对逻辑复制还进行多项性能改进。订阅者可以使用并行方式处理大型事务。对于没有主键的表,订阅者可以使用B-tree索引代替顺序扫描查找行。在某些条件下,您还可以使用二进制格式加速初始表同步。
改进PostgreSQL 16逻辑复制的访问控制,新增预定义角色 pg_create_subscription
,该角色允许用户新建逻辑订阅。
PostgreSQL 16支持双向逻辑复制功能,可以在两个不同发布者的表之间进行数据复制。
开发者体验
PostgreSQL 16引入更多SQL/JSON标准语法,包括构造函数和谓词,例如JSON_ARRAY()
、JSON_ARRAYAGG()
和IS JSON
。该版本允许使用下划线作为千位分隔符(如5_432_000
),并支持非十进制整数常量(如0x1538
、0o12470
和0b1010100111000
)。
PostgreSQL 16为开发者提供更多psql
命令,包括\bind
,该命令允许用户使用带参数的查询,并使用 \bind
来代替变量(例如 SELECT $1::int + $2::int \bind 1 2 \g
)。
PostgreSQL 16改进文本排序规则(text collations)。该版本构建(Build)时默认启用ICU(国际化组件),并从系统环境中确定默认的ICU区域设置,允许自定义ICU排序规则。
监控
理解I/O操作对系统的影响是优化数据库工作负载性能的一个关键方面。PostgreSQL 16引入了一项与I/O操作相关的关键性新指标pg_stat_io
,用于详细分析I/O访问模式。
此外,该版本在pg_stat_all_tables
视图中添加了一个新字段,该字段记录了最后一次扫描表或索引的时间戳。PostgreSQL 16通过记录语句中传入的参数值,提升auto_explain
的可读性,以及pg_stat_statements
和pg_stat_activity
使用查询跟踪算法的准确性。
访问控制与安全性
PostgreSQL 16提供更精细的访问控制选项,并增强相关安全功能。该版本改进pg_hba.conf
和pg_ident.conf
的管理,包括允许使用正则表达式匹配用户和数据库名称,并支持使用include
指令来引入外部配置文件。
该版本新增有关安全性的客户端连接参数,具体参数如下:
require_auth
:允许客户端指定可接受的来自服务器端的身份验证参数。sslrootcert="system"
:表示PostgreSQL将使用客户端操作系统提供的可信证书(CA)。
此外,该版本新增对Kerberos信任委托的支持,允许postgres_fdw
和dblink
类似插件使用经过身份验证的凭证连接到受信任的服务。
升级指导
建议您升级到PolarDB PostgreSQL版 16版本。升级到PolarDB PostgreSQL版兼容PostgreSQL 16版本意味着您可以与PostgreSQL社区保持同步,获得更多的资源和支持,帮助您解决问题并学习数据库的最佳实践。
在PolarDB PostgreSQL版 15版本升级到PolarDB PostgreSQL版 16版本的过程中,大部分的数据类型、内置函数、表列和对象无明显变化,大多数为细节改进。通过逻辑复制等方式(推荐使用DTS工具进行PolarDB PostgreSQL版间的迁移)可以实现接近100%的兼容性,具体的变化细节如下所示。
此处仅为PolarDB PostgreSQL版 15版本与PolarDB PostgreSQL版 16版本区别。其他PolarDB PostgreSQL版版本升级到PolarDB PostgreSQL版 15中的区别,请参见PostgreSQL 15与PostgreSQL 14区别和PolarDB PostgreSQL 14版相对于PolarDB PostgreSQL 11版的变化点。
类型
禁止主键使用NULLS NOT DISTINCT索引。
函数与表达式
更新PL/pgSQL绑定游标变量的分配规则:在PostgreSQL 16之前,此类变量的字符串值在游标分配期间被设置为与变量名称相匹配的值。然而,在该版本中该值将在OPEN期间进行分配,并且将不再与变量名称相匹配。若需恢复以往的行为,请在OPEN之前将所需的
portal
名称分配给游标变量。删除
pg_walinspect
函数:pg_get_wal_records_info_till_end_of_wal()
和pg_get_wal_stats_till_end_of_wal()
。收紧对继承表/分区表的GENERATED表达式限制:父表和子表的列必须具备相同的生成状态,但现在实际的生成表达式可以不同。
REINDEX DATABASE和
reindexdb
不再处理系统表索引:可使用REINDEX SYSTEM和reindexdb --system
来处理此类索引。删除使用ON SELECT规则手动创建视图的功能。
权限
WITH INHERIT子句覆盖:该机制允许继承某些角色,同时不继承其他角色,因为成员的继承状态是在GRANT时设定的。此前,成员角色的继承状态仅受到角色自身的继承状态的影响,对角色继承状态的更改将影响所有之前和未来的成员角色。
限制CREATEROLE的权限及其修改其他角色的能力:在PostgreSQL 16之前,具有CREATEROLE权限的角色可以更改任何非超级用户角色的许多权限。此类操作(包括添加成员)在该版本要求请求更改的角色具有ADMIN OPTION权限。例如,现在只有在拥有ADMIN OPTION权限的情况下才能更改CREATEDB、REPLICATION和BYPASSRLS属性。
其他
删除只读参数
lc_collate
和lc_ctype
。删除参数
boost_trigger_file
。删除参数
vacuum_defer_cleanup_age
。重命名参数
force_parallel_mode
为debug_parallel_query
。
- 本页导读
- 版本介绍
- 发布时间
- 费用说明
- 关键提升
- 性能提升
- 逻辑复制
- 开发者体验
- 监控
- 访问控制与安全性
- 升级指导
- 类型
- 函数与表达式
- 权限
- 其他