PostgreSQL13 新特性介绍
PostgreSQL 13.0版本已于2020-09-24发行,目前最新版为PostgreSQL 13.1。PostgreSQL 13版本中包含了令人欣喜的新特性和优化,其中典型的有:
- Btree索引优化(引入Deduplication技术)
- 支持增量排序
- 支持并行vacuum index
- 支持可信插件
- 支持扩展统计信息
- 支持hash aggregation使用磁盘存储
本文我们将选取几个PostgreSQL 13中的重点新特性进行介绍,让读者先睹为快。
1. Btree索引优化
如果一张表的某些列值不是唯一的,那么将会存在很多重复值,一旦该列上建有索引的话,那么索引也会有很多重复的索引项。在PostgreSQL 13中引入了deduplicate功能,该功能将会定期的将重复的索引项合并,有效地减少了索引的存储空间。随着索引项的减少,重建索引、vacuum索引的速度都将获得提升,查询的效率也会得到提升。
下面我们分别在PostgreSQL 12 和 13 版本中创建唯一索引和包含大量重复项的索引,比较一下效果。测试脚本如下:
CREATE TABLE test_tbl (id int4, str varchar(64), time timestamp without time zone);
INSERT INTO test_tbl (id, str, time) SELECT round(100000000*random()), 'test_tbl_000' || num, '2020-12-31 24:00:00' FROM generate_series(1,6000000) num;
CREATE UNIQUE INDEX idx_on_str ON test_tbl USING BTREE(str);
CREATE INDEX idx_on_time ON test_tbl USING BTREE(time);
idx_on_str是唯一索引;idx_on_time是非唯一索引,存储的索引项都一样。
PostgreSQL 12.2 查看索引大小,如下:
在PostgreSQL 13 中查看索引大小:
根据以上信息可以看出,创建索引后,唯一索引在12版本13版本大小一致,都是232MB;但是非唯一索引的差别较大,13版本的非唯一索引大小约为12版本的1/3不到,减小了很多存储空间。
2. 增量排序
增量排序用在多列排序的场景下来加快排序速度。例如,下面的SQL:
SELECT * FROM table ORDER BY c1, c2 LIMIT 10;
如果c1已经排好序,那么只需要在此基础上对c2进行增量排序即可。PostgreSQL 13 版本新增了enable_incrementalsort参数控制是否开启增量排序,此参数默认开启,可以通过set enable_incremental_sort = off 关闭。
下面我们在100万条数据的表上测试一下增量排序的效果:
未打开增量排序:
打开增量排序:
未打开增量排序前,sql执行时间为222ms,打开增量排序之后,执行时间变为0.213ms,性能相比未开启增量排序时提升了好几个数量级。
3. 支持并行VACUUM
PostgreSQL 13支持了对索引的并行VACUUM,可以通过指定parallel选项打开该功能。使用该功能存在如下限制:
- 目前仅限于索引的并行vacuum,每个索引会分配一个vacuum worker。
- 不支持在加上FULL选项后使用。
- 只有在至少包含有2个及以上索引的表上使用parallel选项才有效。
- 索引的大小超过min_parallel_index_scan_size
下面我们准备一张包含300万条数据的表,表上建了两个索引,在PostgreSQL 13上对比下正常vacuum和并行vacuum的效果:
先看在PostgreSQL 13正常vacuum的情况:
再看下在pg13下并行vacuum的执行情况:
从上图比较可以看到,启用并行vacuum之后时间由356ms减少到42ms,提升了8倍多。
4. 可信插件
PostgreSQL 13允许 非superuser安装一些被指定为可信的插件到自己的数据库中,只要该用户拥有 CREATE 权限即可。之前的版本是当用户想安装一个插件的时候,必须具有superuser权限。在pg13里将不需要这样了:只要某个插件被标记为“trusted”,那么就不再需要superuser权限了。插件是否可信,取决于插件的control文件,只要在control文件里设置了trusted = true,
那么该插件就是可信的。
我们创建一个普通用户,然后用该用户登录数据库去创建插件会失败:
然后我们在pg_stat_statements.control文件里加上trusted = true之后再去尝试就成功了:
5. 总结
PostgreSQL 13带来了很多令人欣喜的新特性和优化,本文限于篇幅只介绍了其中4个。包括逻辑复制支持分区表,扩展统计信息,跟踪wal使用信息等很多很有意思的功能读者可以自行探索。
详细说明请参考社区官方Release Notes:https://www.postgresql.org/docs/13/release-13.html
- 点赞
- 收藏
- 关注作者
评论(0)