PostgreSQL 並行vacuum patch - 暨為什麼需要並行vacuum或分割槽表
標籤
PostgreSQL , vacuum , freeze , 分割槽表 , 並行vacuum
背景
我們之前做過一個這樣的測試,單表資料從1000萬到10億,對其進行增刪改查的壓測,效能幾乎沒有衰減。
資料量 | 寫入吞吐 | 查詢tps | 更新tps |
---|---|---|---|
1000萬 | 58萬行/s | 67萬 | 23.1萬 |
1億 | 53.2萬行/s | 63.4萬 | 24.5萬 |
10億 | 162.6萬行/s | 60.6萬 | 23.4萬 |
《HTAP資料庫 PostgreSQL 場景與效能測試之 45 - (OLTP) 資料量與效能的線性關係(10億+無衰減), 暨單表多大需要分割槽》
是不是就意味著我們不需要對資料庫進行分表了呢?
實際上單表太大,還可能引入其他問題,例如:
1、建立索引,大表建立索引時間會更久,當然PostgreSQL 11已經支援單表並行建立索引了,所以這個問題逐漸會不存在。
《PostgreSQL 11 preview - 並行排序、並行索引 (效能線性暴增) 單例項100億TOP-K僅40秒》
2、加欄位並加預設值,或者不能online DDL的操作。單表越大,操作時間會越久。
這個問題的解法:1 支援更多的ONLINE DDL(類似 pg_repack 的原理)。2 支援DDL並行。
3、垃圾回收,因為單表的垃圾回收目前只支援序列,所以單表越大,垃圾回收的時間越長。
這個問題的解法:支援並行VACUUM。社群已經在做這個PATCH。
4、FREEZE表,與垃圾回收類似的問題,單表的垃圾回收,目前只能序列。而FREEZE如果很慢,並且慢過產生TXID的速度,可能導致資料庫因為XID耗盡,需要停止業務來進行凍結。
這個問題的解法:1 支援並行VACUUM。社群已經在做這個PATCH。 2 skip clean page(9.6開始已經支援),使得freeze效率高了很多。3 支援64BIT txid,完全杜絕freeze操作。
5、單表可能打爆檔案系統,因為單個表只能放在單個表空間中,表空間對應檔案系統,所以單表的大小也受到檔案系統大小的限制。
這個問題的解法:1 使用類似LVM,ZFS這樣的卷管理,使得單個檔案系統很大很大。 2 使用分割槽表。
以上問題是單表很大時,可能出現的問題。
所以單表多大需要使用分割槽表呢?主要考慮幾個方面:
1、表上的DML頻率。
2、資料庫的硬體效能指標。
3、查詢方面的優化需求,例如是否可以通過分割槽來降維,優化SQL效能。
比較傻瓜式的建議(SSD,多核):
不頻繁更新、刪除的表:記錄數20億,表佔用空間200 GB。就可以考慮分表了。
平反更新、刪除、插入的表:記錄數2億,表佔用空間20 GB。就可以考慮分表了。
如何平滑將單表切換為分割槽表?
1、pg_pathman提供了平滑切換到分割槽表的API。
https://github.com/postgrespro/pg_pathman
《PostgreSQL 9.5+ 高效分割槽表實現 - pg_pathman》
vacuum的核心改進
針對前面提到的垃圾回收,freeze操作,核心層面可以做出的改進。
1、並行vacuum
https://commitfest.postgresql.org/13/954/
目前這個PATCH還沒有提交到主幹。
2、跳過clean page(根據vm檔案標記位),9.6開始,就支援了SKIP CLEANUP PAGE,freeze效能大幅提升。
《PostgreSQL 9.6 vacuum freeze大幅效能提升 程式碼淺析》
3、64bit xid,治本的方法。
https://commitfest.postgresql.org/17/1178/
PostgresPRO 版本引入了64BIT的txid,所以不再需要全域性freeze操作。
https://postgrespro.com/docs/enterprise/10/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND
將資料庫的PAGE轉換為相容postgrespro的PAGE,可以使用如果工具。
對於FREEZE操作來說,方法1和2都是治標不治本的方法,3是社群正在改進的方向,可以看到社群的commitfest已經在加快做64bit txid 的 refact了。
https://github.com/postgrespro/pg_pageprep
參考
《HTAP資料庫 PostgreSQL 場景與效能測試之 45 - (OLTP) 資料量與效能的線性關係(10億+無衰減), 暨單表多大需要分割槽》
《PostgreSQL 11 preview - 並行排序、並行索引 (效能線性暴增) 單例項100億TOP-K僅40秒》
相關文章
- 第二週-20200306-PostgreSQL13並行vacuum索引SQL並行索引
- Postgresql關於Vacuum的作用和操作方法,Vacuum full鎖表並生成新的relfilenodeSQL
- PostgreSQL/LightDB 不走並行是為什麼?SQL並行
- PostgreSQL的vacuum流程SQL
- 【Postgresql】VACUUM 垃圾回收SQL
- PostgreSQL vacuum可見性SQL
- openGauss 對錶執行VACUUM
- 聊聊Spark的分割槽、並行度 —— 前奏篇Spark並行
- PostgreSQL官方並行更新時間表SQL並行
- 重要 | Spark分割槽並行度決定機制Spark並行
- 新特性:postgresql的vacuum漫談SQL
- PostgreSQL DBA(92) - PG 12 Improving VACUUMSQL
- PostgreSQL VACUUM 之深入淺出 (一)SQL
- PostgreSQL VACUUM 之深入淺出 (二)SQL
- PostgreSQL VACUUM 之深入淺出 (三)SQL
- PostgreSQL DBA(142) - PG 12(Monitoring PostgreSQL VACUUM processes)SQL
- Greenplum計算能力估算-暨多大表需要分割槽,單個分割槽多大適宜
- PostgreSQL/LightDB 分割槽表之分割槽裁剪SQL
- PostgreSQL DBA(143) - pgAdmin(Monitoring PostgreSQL VACUUM processes#2)SQL
- PostgreSQL 之並行框架SQL並行框架
- PostgreSQL 原始碼解讀(127)- MVCC#11(vacuum過程-vacuum_rel函式)SQL原始碼MVCC#函式
- mysql 進行表分割槽MySql
- Linux系統如何進行分割槽?swap分割槽是什麼?Linux
- linux掛載新硬碟並進行分割槽格式化Linux硬碟
- PostgreSQL 原始碼解讀(131)- MVCC#15(vacuum過程-lazy_vacuum_heap函式)SQL原始碼MVCC#函式
- PostgreSQL 原始碼解讀(128)- MVCC#12(vacuum過程-heap_vacuum_rel函式)SQL原始碼MVCC#函式
- PostgreSQL:傳統分割槽表SQL
- PostgreSQL:內建分割槽表SQL
- 對Oracle分割槽表進行表空間遷移並處理ORA-14511問題Oracle
- 為linux新增一塊新硬碟並分割槽Linux硬碟
- postgreSQL 12-2 vacuum-主流程SQL
- PostgreSQL並行查詢概述SQL並行
- PostgreSQL 原始碼解讀(132)- MVCC#16(vacuum過程-lazy_vacuum_index函式#1)SQL原始碼MVCC#Index函式
- PostgreSQL 原始碼解讀(129)- MVCC#13(vacuum過程-vacuum_set_xid_limits函式)SQL原始碼MVCC#MIT函式
- PostgreSQL 原始碼解讀(133)- MVCC#17(vacuum過程-lazy_vacuum_index函式#2)SQL原始碼MVCC#Index函式
- postgresql VACUUM 不會從表中刪除死行的三個原因SQL
- PostgreSQL分割槽表更新思路SQL
- PostgreSQL DBA(159) - pgAdmin(Allow vacuum command to process indexes in paralleSQLIndex