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

日积月累 | 致敬PostgreSQL 13退役

有山皆图画,无水不文章。
白马西风塞上,杏花烟雨江南。
清风明月本无价,近水远山皆有情。
雾锁山头山锁雾,天连水尾水连天。

ChatGPT Image 2025年11月13日 12_28_40.png

伴随PostgreSQL 18.1、17.7、16.11、15.15、14.20、13.23小版本更新,版本13今天迎来了其退役日。本文将与大家一同回顾13版本的几个高光特性,致敬其退役。

特性一:索引去重:Deduplication

PostgreSQL 13在B-Tree索引的存储层面引入了Deduplication去重技术,能将重复的索引合并,大幅度地减少重复索引的数量。

下面的语句使用deduplicate_items参数进行对比测试

create table duplindex_test(a int, b int) ; create index idx_norm on duplindex_test using btree(b) WITH (deduplicate_items = off) ; create index idx_dupl on duplindex_test using btree(b) WITH (deduplicate_items = on) ; insert into duplindex_test select 3,5 from generate_series(1,100000) ;

使用deduplicate_items = on的索引大小将缩减2/3。由此可知,Deduplication去重具有以下优点。

  • 减小存储空间:重复的索引被合并,减小索引的存储空间。
  • 减少维护开销:加快重建索引的速度,减少VACUUM索引的开销。
  • 提高查询效率:越小的索引的查询效率越高,可以提高系统I/O性能。

特性二:增量排序:Incremental Sort

PostgreSQL 13排序功能的改进包括查询组合条件字段的增量排序:Incremental Sort。

通过增量排序可以加快数据的排序速度,其原理是借助有序的索引来实现:
表的a和b两个字段,a字段上建立了索引,且索引有序,此时对a字段和b字段的组合条件排序只需要在a字段排序的基础上再对b字段排序即可。

下面的示例通过语句的执行计划可观察增量排序的过程:

CREATE TABLE incresort_test(a int,b int); INSERT INTO incresort_test(a,b) SELECT n,round(random()*100000000) FROM generate_series(1,1000000) n; CREATE INDEX idx_incresort_test ON incresort_test USING btree(a);

创建测试表,插入测试数据之后对a字段创建索引,再执行下面的语句查看执行计划:

=# EXPLAIN(costs off) SELECT * FROM incresort_test ORDER BY a,b; QUERY PLAN ------------------------------------------------------------- Incremental Sort Sort Key: a, b Presorted Key: a -> Index Scan using idx_incresort_test on incresort_test (4 rows)

关注上面执行计划中的Incremental Sort和Presorted Key:a所在行可以看出,先使用a字段的idx_incresort_test索引进行预排序,再对b字段进行增量排序。

这个特性也为16~18的Order by、Distinct/Distinct on、GiST和SP-GiST索引的排序优化特性做了基础性铺垫。

特性三:备份可靠性提高

PostgreSQL 13引入了两个非常有用的特性来提高物理备份的可靠性,分别是备份清单backup manifests及备份验证工具pg_verifybackup。

  • backup manifests:通过pg_basebackup工具发起物理备份时列出的备份清单。
  • pg_verifybackup:根据备份清单匹配验证备份内容的工具。

从13版本开始,使用pg_basebackup工具执行全备时会自动生成备份清单backup_manifest文件,该文件内容示例如下:

{ "PostgreSQL-Backup-Manifest-Version": 1, "Files": [ { "Path": "backup_label", "Size": 226, "Last-Modified": "2020-06-06 03:13:02 GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "9c1588c0" }, { "Path": "global/1262", "Size": 8192, "Last-Modified": "2020-06-02 09:47:56 GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "a806d90f" }, … ], "WAL-Ranges": [ { "Timeline": 1, "Start-LSN": "0/6F000028", "End-LSN": "0/6F000138" } ], "Manifest-Checksum": "6241b42fdc594dbf23c48390b9e204b6599d4cb6cef420efc374034e4d5a972b"}

后续可以再使用pg_verifybackup工具根据备份清单文件验证备份的完整性。

$ pg_verifybackup $PGDATA backup successfully verified

pg_verifybackup工具验证的主要步骤如下:
1)检查备份目录
2)查找并解析备份清单
3)扫描备份清单记录的文件
4)验证checksum
5)验证并解析WAL记录
6)验证结束

注:这两个特性也为17版本实现增量备份提前做了充足的准备工作。

本命书籍:PostgreSQL 13 Cookbook

最后再介绍一本非常实用的英文书,即便现在翻看也不过时。

image.png

这本私房菜介绍如何在13版本里使用120多个小秘诀来进行集群管理、备份恢复、高可用、安全加固、日志分析、运行监控、工具调优等。

每个小技巧都是按下面的5个流程进行:

  • Getting ready 准备工作
  • How to do it 如何使用
  • How it works 内在的逻辑
  • Thres’s more 扩展阅读
  • See also 参考资料

最后感谢PG社区为我们出品这么优秀的开源产品!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论