背景
列存優勢
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.com4、citus開發的PG支援向量化執行的代碼,在使用列存儲時,AP查詢的性能有巨大的提升。
https://github.com/citusdata/postgres_vectorization_test5、
《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/ColumnOrientedSTorage9、
《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/imcs12、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熱門書籍等,獎品豐富,快來許願。
開不開森.