近日由於系統運行時間太長,數據庫庫表中的數據也是越來越多,為了縮短庫表的操作時間,所以對數據庫中的部分庫表進行分區的操作。
通過研究,決定采用pg_pathman插件對庫表進行分區操作。pg_pathman安裝、配置特此記錄。
Pg_pathman原理:
PostgreSQL傳統的分區方法,使用約束來區分不同分區存放的數據(配置constraint_exclusion=partition),執行select/delete/update時執行計划根據約束和查詢條件排除不需要查詢的分區表。
調用COPY或插入數據時使用觸發器或規則,將數據插入對應的分區表。
傳統的做法,無論是查詢還是插入,對性能的影響都較大。
pg_pathman與傳統的繼承分區表做法有一個不同的地方,分區的定義存放在一張元數據表中,表的信息會cache在內存中,同時使用HOOK來實現RELATION的替換,所以效率非常高。
目前支持兩種分區模式,range和hash,其中range使用binary search查找對應的分區,hash使用hash search查找對應的分區。
Pg_pathman 特性:
1. 目前支持range , hash分區。
2. 支持自動分區管理(通過函數接口創建分區,自動將主表數據遷移到分區表),或手工分區管理(通過函數實現,將已有的表綁定到分區表,或者從分區表剝離)。
3. 支持的分區字段類型包括int, float, date, 以及其他常用類型,包括自定義的domain。
4. 通過CUSTOM SCAN實現了有效的分區表JOIN, 子查詢過濾分區。
5. 使用RuntimeAppend & RuntimeMergeAppend custom plan nodes實現了動態分區選擇。
6. PartitionFilter HOOK,實現insert inplace, 代替傳統的insert trigger或insert rule。
7. 支持自動新增分區。 目前僅支持range分區表。
8. 支持copy from/to 直接讀取或寫入分區表,提高效率。
9. 支持分區字段的更新,需要添加觸發器,如果不需要更新分區字段,則不建議添加這個觸發器,會產生一定的性能影響。
10. 允許用戶自定義回調函數,在創建分區時會自動觸發。
回調函數的規則如下
$part_init_callback$(args JSONB) RETURNS VOID 傳入參數如下 /* RANGE-partitioned table abc (for exp: child abc_4) */ { "parent": "abc", "parttype": "2", "partition": "abc_4", "range_max": "401", "range_min": "301" } /* HASH-partitioned table abc (for exp: child abc_0) */ { "parent": "abc", "parttype": "1", "partition": "abc_0" }
11. 非堵塞式創建分區表,以及后台自動將主表數據遷移到分區表,非堵塞式。
12. 支持FDW,通過配置參數pg_pathman.insert_into_fdw=(disabled | postgres | any_fdw)支持postgres_fdw或任意fdw
13. 支持GUC參數配置,注意由於使用了HOOK,如果其他插件也使用了相同的HOOK,需要將pg_pathman放在前面注冊,如pg_stat_statements。
以上內容摘自:https://yq.aliyun.com/articles/62314?spm=5176.8091938.0.0.tu4vhW
Pg_pathman安裝、配置
Pg_pathman使用了custom scan provider api,所以只支持PostgreSQL 9.5以及以上的版本。
本次pg_pathman安裝采用git的方式安裝,首先安裝git工具:
# yum install git

切換到admin用戶,並進入postgresql目錄:

從git克隆pg_pathman:
$ git clone https://github.com/postgrespro/pg_pathman

導入postgresql安裝的環境變量:
$ export PATH=/home/digoal/pgsql9.6:$PATH
$ cd pg_pathman
$ make USE_PGXS=1
$ make USE_PGXS=1 install
更改postgresql的配置文件
$ cd $PGDATA
$ vi postgresql.conf
#將shared_preload_libraries注釋取消,將下面變量賦值進去
shared_preload_libraries = 'pg_pathman,pg_stat_statements'
修改完成后,重啟數據庫服務
$ pg_ctl restart -m fast
啟動數據庫報錯

這是由於未安裝pg_stat_statements模塊導致,pg_stat_statements模塊位於contrib包中,因為contrib包為第三方工具包,雖然在postgresql數據庫的安裝包里面已經自帶了contrib包,但是在安裝數據庫的時候並未主動安裝,因此需要我們手動安裝一下。
進去之前解壓以后的postgresql數據庫安裝包的文件夾
$ cd /usr/local/postgresql-9.6.13

進入contrib文件夾,一次執行以下命令:
make
make install
執行成功以后,再次啟動數據庫服務

啟動成功
創建擴展
使用psql連接登錄數據庫

創建擴展
# create extension pg_pathman;
# create extension pg_stat_statements;

查看
# \dx

至此,pg_pathman安裝配置完成
