背景
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的成熟功能不仅与顶级商业数据库系统匹配,而且在高级数据库功能、可扩展性、安全性和稳定性方面都超越了它们。