之前分享过阿里云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 9.6 beta1的源码,用最近的patch.
安装和测试
以上测试,软中断较多,并没有体现pg分区表代码层的优势。
使用copy 测试
效果立竿见影