天天看點

PostgreSQL 10.0 preview 功能增強 - OLAP增強 向量聚集索引(列存儲擴充)

postgresql , 10.0 , vertical clustered index (columnar store extension) , 列存儲 , 向量聚集索引

未來資料庫oltp+olap逐漸模糊化,需求逐漸融合是一個大的趨勢,如果你的資料庫隻支援oltp的場景,未來可能會成為業務的絆腳石。

在這方面postgresql每年釋出的新版本,都給使用者很大的驚喜,oltp已經具備非常強大的競争力(性能、功能、穩定性、成熟度、案例、跨行業應用等),而olap方面,新增的feature也是層出不窮。

<a href="https://github.com/digoal/blog/blob/master/201703/20170312_14.md">《postgresql 10.0 preview 性能增強 - olap提速架構, faster expression evaluation framework(含jit)》</a>

<a href="https://github.com/digoal/blog/blob/master/201612/20161216_01.md">《分析加速引擎黑科技 - llvm、列存、多核并行、算子複用 大聯姻 - 一起來開啟postgresql的百寶箱》</a>

<a href="https://github.com/digoal/blog/blob/master/201702/20170225_01.md">《postgresql 向量化執行插件(瓦片式實作) 10x提速olap》</a>

postgresql 10.0将要整合的一個功能:

vertical clustered index (columnar store extension) , 列存儲 , 向量聚集索引。

這個子產品是fujitsu實驗室提供的,一種新增的vci索引通路接口,這麼做可以最小化資料庫的改動。

使用者僅需要在原來的堆表上建立vci即可(向量聚集索引),索引将以向量聚集形式組織,提升查詢性能。

vci有兩方面的優化,索引資料分為兩個部分:

1. 寫優化部分(wos)

行格式存儲(類似堆表),同時攜帶xmin/xmax标記(事務号),是以如果更新wos中的資料,和更新postgresql原有的堆表一樣效率很高。

postgresql backend process或者autovacuum會持續自動的将wos中已經frozen的記錄(即對所有事務可見的記錄),轉移到ros(讀優化部分)存儲。

ros存儲中,沒有版本資訊(xmin/xmax),有tuple id,可以通過tuple id通路ros中的記錄。(沒有版本資訊,如何判斷可見性呢?後面講)

2. 讀優化部分(ros)

ros為列存儲,每列一個或一批檔案,在ros中,記錄是以extent來組織的,每個extent存儲262,144行記錄,可以友善的建立堆表tid to ros crid的映射關系。

插入vci記錄,與插入索引一樣。(插入wos,背景自動将frozen記錄合并到ros)

删除vci記錄,如果資料隻在wos中,删除和删堆表記錄一樣,做标記,如果資料已經從wos合并到ros,那麼需要維護一個向量,這個向量中包含被删除的記錄在ros中的tuple id, 以及删除該記錄的事務的xact id等。讀取ros時,根據這個向量,過濾ros中對應的tuple id.

更新vci記錄,與删除類似。

目前提供的性能測試資料

PostgreSQL 10.0 preview 功能增強 - OLAP增強 向量聚集索引(列存儲擴充)
PostgreSQL 10.0 preview 功能增強 - OLAP增強 向量聚集索引(列存儲擴充)
PostgreSQL 10.0 preview 功能增強 - OLAP增強 向量聚集索引(列存儲擴充)

讨論

這個patch的讨論,詳見郵件組,本文末尾url。

postgresql社群的作風非常嚴謹,一個patch可能在郵件組中讨論幾個月甚至幾年,根據大家的意見反複的修正,patch合并到master已經非常成熟,是以postgresql的穩定性也是遠近聞名的。

<a href="https://commitfest.postgresql.org/13/945/">https://commitfest.postgresql.org/13/945/</a>

<a href="https://www.postgresql.org/message-id/flat/cajrrpgfac7wc9nk6ptty6yn-nn+hcy8xolah2doyhvg5d6hsaa@mail.gmail.com#cajrrpgfac7wc9nk6ptty6yn-nn+hcy8xolah2doyhvg5d6hsaa@mail.gmail.com">https://www.postgresql.org/message-id/flat/cajrrpgfac7wc9nk6ptty6yn-nn+hcy8xolah2doyhvg5d6hsaa@mail.gmail.com#cajrrpgfac7wc9nk6ptty6yn-nn+hcy8xolah2doyhvg5d6hsaa@mail.gmail.com</a>