天天看點

PostgreSQL 列存, 混合存儲, 列存索引, 向量化存儲, 混合索引 - OLTP OLAP OLXP HTAP 混合負載應用

背景

列存優勢

1、列存沒有行存1666列的限制

2、列存的大量記錄數掃描比行存節約資源

3、列存壓縮比高,節約空間

4、列存的大量資料計算可以使用向量化執行,效率高

行存優勢

1、行存查詢多列時快

2、行存DML效率高

簡單來說,行存适合OLTP業務,列存适合OLAP業務。

如果業務是混合負載,既有高并發SQL,又有實時分析業務怎麼辦?

Oracle的做法:

in memory column store,實際上是兩份存儲,一份在磁盤(行存),一份在記憶體中使用列存。

根據SQL,優化器選擇掃描列存還是行存。(通常看planNODE中資料掃描的行選擇性,輸出的行數,輸出的列數等)

Oracle in memory column store是兩份存儲的思路。

PostgreSQL如何應對混合業務場景呢?

目前PG已經有了SMP并行執行的優化器功能,豐富的聚合函數,視窗函數等,已經有很好的OLAP處理能力。如果能在資料存儲組織形式上支援到位,勢必會給OLAP的能力帶來更大的質的飛躍,以更好的适合OLTP OLAP混合業務場景。

一些PG 混合存儲的資料

1、PG roadmap

https://www.postgresql.org/developer/roadmap/ https://wiki.postgresql.org/wiki/PostgreSQL11_Roadmap

裡面有提到postgres pro, fujsut 都有計劃要開發列存儲或者讀、寫優化索引。

2、PostgreSQL 12 可能會開放storage pluggable API,以支援列存組織形式表。

https://commitfest.postgresql.org/22/1283/

3、ROS, WOS

讀優化和寫優化存儲,适合TP AP混合業務

https://www.postgresql.org/message-id/flat/CAJrrPGfaC7WC9NK6PTTy6YN-NN%2BhCy8xOLAh2doYhVg5d6HsAA%40mail.gmail.com

4、citus開發的PG支援向量化執行的代碼,在使用列存儲時,AP查詢的性能有巨大的提升。

https://github.com/citusdata/postgres_vectorization_test

5、

《Extending PostgreSQL with Column Store Indexes》

6、cstore, citusdata(已被微軟收購),開源的列存儲FDW插件

https://www.citusdata.com/blog/2014/04/03/columnar-store-for-analytics/

7、2ndquadrant 公司的PG列存開發計劃

https://blog.2ndquadrant.com/column-store-plans/

8、PG 列存儲開發計劃讨論wiki

https://wiki.postgresql.org/wiki/ColumnOrientedSTorage

9、

《Column-Stores vs. Row-Stores: How Different Are They Really?

10、custom scan provide接口,pg_strom插件使用csp接口實作了gpu加速,其中GPU加速支援資料加載到GPU緩存、或者檔案中以列形式組織,加速AP請求的SQL。(這種為非實時維護的資料組織形式,而是讀時組織的形式)

http://heterodb.github.io/pg-strom/

11、In-Memory Columnar Store extension for PostgreSQL,PG的記憶體列存表插件

https://github.com/knizhnik/imcs

12、vops,PG的瓦片式存儲(不改變現有HEAP存儲接口),以及向量化執行組合的插件。

https://github.com/postgrespro/vops/blob/master/vops.html 《PostgreSQL VOPS 向量計算 + DBLINK異步并行 - 單執行個體 10億 聚合計算跑進2秒》 《PostgreSQL 向量化執行插件(瓦片式實作-vops) 10x提速OLAP》

PostgreSQL 列存, 混合存儲, 列存索引, 向量化存儲, 混合索引 - OLTP OLAP OLXP HTAP 混合負載優化

根據以上資料,可以總結出得到一個結論:

一份資料,多種組織形式存儲。不同的組織形式存儲适合于不同的業務,不同的資料組織形式存儲,有不同的資料掃描方法,根據SQL的統計資訊,PLAN等資訊判斷選擇采用什麼樣的組織形式的資料通路。

而恰好PG的可擴充性,非常适合于擴充出一份資料,多份存儲的功能。

1、AM擴充接口,用于索引的擴充,例如目前PG以及支援了9種索引接口(btree, hash, gin, gist, spgist, brin, bloom, rum, zombodb)。

2、plugable storage接口。PG 12可能會釋出這個新功能。

1 優化思路

1、寫優化

2、讀優化

2 資料組織形式

1、表組織形式

多份表的組織形式(多個資料副本),例如以HEAP存儲為主(DML, OLTP業務),以列存儲為輔(OLAP業務),資料落HEAP存儲後傳回,以保障SQL的響應速度,背景異步的合并到列存儲。

不同的組織形式存儲适合于不同的業務,不同的資料組織形式存儲,有不同的資料掃描方法,根據SQL的統計資訊,PLAN等資訊判斷選擇采用什麼樣的組織形式的資料通路。

主,輔形式類似GIN索引的思路,fast update 方法,使用pending list區域,降低GIN索引引入的寫RT升高,導緻資料寫入吞吐下降的問題。

2、索引組織形式

資料存儲格式為一份(行存儲,OLTP),增加一種索引接口(列組織形式(OLAP業務)),例如叫做VCI。

當有OLAP業務需求是,建立VCI索引,優化器根據SQL請求,決定使用VCI索引,還是TP型的索引。

3、分區表混合組織

不同的分區使用不同的組織形式。

例如,這種情況适合不同時間區間有不同的通路需求的場景。比如1個月以前的資料,大多數适合都是AP型的請求,1個月内的資料基本上是高并發的OLTP請求。可以針對不同的分區,采用不同的資料組織形式存儲。

4、分區索引混合組織

不同的分區使用不同的索引組織形式。

類似分區表混合組織。

3 實作思路

1、擴充AM,即資料使用行存,索引使用列存儲。擴充列存索引接口。

2、擴充存儲接口,一份資料,多份表存儲的形式。不同的表存儲形式,可以有自己獨立的索引體系。優化器根據SQL請求,選擇不同的資料存儲形式,進行通路,以适合OLTP OLAP的混合請求。

參考

《Greenplum 優化CASE - 對齊JOIN字段類型,使用數組代替字元串,降低字元串處理開銷,列存降低掃描開銷》 《PostgreSQL GPU 加速(HeteroDB pg_strom) (GPU計算, GPU-DIO-Nvme SSD, 列存, GPU記憶體緩存)》 《Greenplum 海量資料,大寬表 行存 VS 列存》 《PostgreSQL 如何讓 列存(外部列存) 并行起來》

[《[未完待續] PostgreSQL ORC fdw - 列存插件》](

https://github.com/digoal/blog/blob/master/201710/20171001_05.md) 《Greenplum 行存、列存,堆表、AO表性能對比 - 阿裡雲HDB for PostgreSQL最佳實踐》 《Greenplum 列存儲加字段現象 - AO列存儲未使用相對偏移》 《Greenplum 行存、列存,堆表、AO表的原理和選擇》 《Greenplum 列存表(AO表)的膨脹、垃圾檢查與空間收縮(含修改分布鍵)》 《列存優化(shard,大小塊,歸整,塊級索引,bitmap scan) - (大量資料實時讀寫)任意列搜尋》 《PostgreSQL 10.0 preview 功能增強 - OLAP增強 向量聚集索引(列存儲擴充)》 《分析加速引擎黑科技 - LLVM、列存、多核并行、算子複用 大聯姻 - 一起來開啟PostgreSQL的百寶箱》 《Greenplum 最佳實踐 - 行存與列存的選擇以及轉換方法》 《PostgreSQL 列存儲引擎 susql (志銘奉獻)》

PostgreSQL 許願連結

您的願望将傳達給PG kernel hacker、資料庫廠商等, 幫助提高資料庫産品品質和功能, 說不定下一個PG版本就有您提出的功能點. 針對非常好的提議,獎勵限量版PG文化衫、紀念品、貼紙、PG熱門書籍等,獎品豐富,快來許願。

開不開森

.

9.9元購買3個月阿裡雲RDS PostgreSQL執行個體

PostgreSQL 解決方案集合