天天看点

PostgreSQL 在路上的特性 - 远离触发器, 拥抱内置分区

之前分享过阿里云rds pg支持分区表的文章

<a href="https://yq.aliyun.com/articles/113">https://yq.aliyun.com/articles/113</a>

今天要给大家带来另一个好消息,

postgresql 社区版本终于要有集成的分区表特性了,再也不用为写分区触发器烦恼了。

(很多人认为pg现有的分区表用法是"惨无人道"的(除了管理不方便,性能也是个问题),就像是一粒老鼠屎,坏了一锅汤。社区终于要把老鼠屎请出去了。)

如果你不care性能,可以看看我以前写的一个通用的分区表触发器函数,一个函数打天下

<a href="http://blog.163.com/digoal@126/blog/static/16387704020128772037884/">http://blog.163.com/digoal@126/blog/static/16387704020128772037884/</a>

内置分区表的讨论和patch详见

<a href="https://www.postgresql.org/message-id/flat/[email protected]#[email protected]">https://www.postgresql.org/message-id/flat/[email protected]#[email protected]</a>

<a href="https://wiki.postgresql.org/wiki/table_partitioning">https://wiki.postgresql.org/wiki/table_partitioning</a>

基本已成型,9.6有合进来的可能。

相比触发器的方法,内置分区直接使用插入更新删除接口处理,节省了parser和optimize的过程,比触发器转成sql更高效。

创建分区主表

添加分区子表

分区主表

分区子表

记录了每个子表的分区规则,是不是和pg_rewrite很像呢

通过记录找出对应范围分区的代码,可以看到它这里用了二分查找来提高范围分区表的分区定位效率

查找list 分区

插入直接使用的是heap_insert接口,而不是rewrite。

(ps: 触发器的分区查找算法有优化的空间,这里没有使用二分查找。因此最后一个分区的性能落差不至于这么大。)

copy 500w记录的性能对比。

PostgreSQL 在路上的特性 - 远离触发器, 拥抱内置分区

使用postgresql 9.6 beta1的源码,用最近的patch.

安装和测试

以上测试,软中断较多,并没有体现pg分区表代码层的优势。

使用copy 测试

效果立竿见影

继续阅读