数据库内核月报 - 2021 / 01

PostgreSQL · 新增特性 · PG 13 新特性

PostgreSQL 13 新特性

背景

PostgreSQL 全球开发组于2020年9月24日宣布PostgreSQL 13正式发布,作为世界上最先进的开源数据库,PostgresSQL 13是目前的最新版本。 阿里云是中国地区第一家支持PostgreSQL 13的云厂商,在 RDS 和 专属集群 两条产品线都提供了版本13的售卖,云数据库服务采用统一的数据库内核(简称AliPG),为客户提供了更稳定、更安全和更高性能的数据库服务。 PostgreSQL 13在索引和检索方面进行了重大改进,有利于大型数据库系统的应用,同时带来了空间的节省和性能的提高,使用聚合或分区的查询能得到更快得响应,使用增强的统计信息使查询计划更加优化,以及很多其他改进。PostgreSQL 13除了具有强烈要求的功能(如并行清理和增量排序)外,还提供了更好的数据库管理体验。同时PostgreSQL 13针对日常管理进行了优化,为应用程序开发人员提供了更多便利,并增强了安全性。

新特性

逻辑复制支持分区表

PostgreSQL 从版本10开始支持逻辑复制,在版本12前逻辑复制仅支持普通表,不支持分区表,如果需要对分区表进行逻辑复制,需单独对所有分区进行逻辑复制。PostgreSQL 13 版本开始,逻辑复制新增了对分区表的支持,具体包括:1. 可以显式地发布分区表,自动发布所有分区;2. 从分区表中添加或删除分区将自动从发布中添加或删除。

Btree索引优化

PostgreSQL 13 版本的Btree索引在存储层面引入了一个重要的技术:Deduplication,是指索引项去重技术,因此有效地处理标准数据库索引B-tree中的重复数据,继而降低了B-tree索引所需的总体使用空间,同时提高了整体查询性能。索引的Deduplication选项默认是开启的,如果想关闭指定索引的Deduplication,需要设置存储参数deduplicate_items为off。

增量排序

PostgreSQL 13 版本的一个重要特性是支持增量排序(Incremental Sorting),查询中来自较早步骤的已排序数据可以加快后续步骤的排序。方法是通过enable_incrementalsort参数控制是否开启增量排序,此参数默认开启。 并行VACUUM索引 PostgreSQL 13 版本允许VACUUM并行处理表的索引,方法是通过PARALLEL参数控制是否开启并行vacuum索引。

并行Reindexdb

reindexdb命令用于重建一个或多个库中表的索引,可以是schema级索引重建,也可以是database级索引重建。reindexdb是REINDEX INDEX命令的的封装,两者在本质上没有区别。PostgreSQL 13 版本前reindexdb不支持并行选项,13 版本此命令新增 -j 选项,支持全库并行索引重建。

wal_keep_size

PostgreSQL 13 版本将 wal_keep_segments 重新定义为 wal_keep_size,决定了为备库保留的WAL量。版本13采用字节大小表示,不再采用保留文件的个数,可通过下述公式换算:wal_keep_size = wal_keep_segments * wal_segment_size。

其他

允许 EXPLAIN、auto_explain、autovacuum、pg_stat_statements 跟踪WAL使用情况统计信息 受益于B树中重复数据的优化,更加的节省空间提升效率 索引和检索方面进行了重大改进,有利于大型数据库系统 优化了聚合及分区表的性能 优化了使用额外数据时的查询计划 更多类型的聚合和分组、高效哈希聚合功能

迁移

PostgreSQL 社区每年会发布一个大版本,每个大版本社区支持5年,大版本通常会带来功能、性能方面的革命性提升,一个版本使用5年后,由于社区不再提供支持,数据库风险将逐渐增加,因此国内的 PostgreSQL 大客户都有非常完善的大版本升级策略和方法。PostgreSQL 支持 pg_dumpall、pg_upgrade 和逻辑复制的方式从低版本升级至13。 阿里云RDS数据库团队提供了 RDS-PostgreSQL 的大版本升级能力,目前支持从 10、11、12 不同版本的源实例升级到 11、12、13,为老版本用户体验新版本特性提供了便利,可以做到零宕机平滑升级。同时支持割接模式和非割接模式两种模式,非割接模式相当于克隆高版本实例,可用于验证和测试,割接模式自动切换连接串到高版本。基于云盘快照复制数据并进行升级,相比于逻辑复制节省数据迁移时间。 PostgreSQL 13 以下特性可能会影响数据库的一致性,升级需要谨慎评估: • 将 IMILAR TO … ESCAPE NULL 改为返回空值 • json[b]_to_tsvector() 将会对字符类型做完整的拼写检查 • 改变 effective_io_concurrency 非默认值影响并发的方式 • 不在 pg_stat_ssl 和 pg_stat_gssapi 两张表中显示辅助进程 • 重命名一些等待时间来保持一致性 • 修复 ALTER FOREIGN TABLE … RENAME COLUMN 返回一个更合适的命令符 • 将 wal_keep_segments 重命名为 wal_keep_size • 移除 PG8.0 之前对于operator classes定义的语法的支持 • 移除 PG7.3 之前对于foreign key constraints、pseudo-types定义的语法支持 • 移除对于unpackaged 插件的支持 • 移除对于posixrules文件的支持 • 升级对于ltree的推断方式 • 修复 pageinspect 的 bt_metap()函数

关于

PostgreSQL是世界上最先进的开源数据库,它的全球社区由成千上万的用户、开发人员、公司或其他组织组成。PostgreSQL起源于加利福尼亚大学伯克利分校,已经有30多年的历史,并且以无与伦比的开发速度继续发展。PostgreSQL的成熟功能不仅与顶级商业数据库系统匹配,而且在高级数据库功能、可扩展性、安全性和稳定性方面都超越了它们。