PostgreSQL13 新特性介绍

网友投稿 861 2022-05-29

postgresql 13.0版本已于2020-09-24发行,目前最新版为PostgreSQL 13.1。PostgreSQL 13版本中包含了令人欣喜的新特性和优化,其中典型的有:

Btree索引优化(引入Deduplication技术)

支持增量排序

支持并行vacuum index

支持可信插件

支持扩展统计信息

支持hash aggregation使用磁盘存储

PostgreSQL13 新特性介绍

本文我们将选取几个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

PostgreSQL 云数据库 PostgreSQL 数据复制服务 DRS 数据库

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:ROM、PROM、EPROM、EEPROM、RAM、SRAM、DRAM的区别
下一篇:Python开发者必知的13个Python GUI库
相关文章