天天看點

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 測試

效果立竿見影

繼續閱讀