一種更高查詢性能的列存儲方式MaxMinT 第一部分

簡介
本文描述了一種列存儲方式和對應的查詢方法,這種存儲方式具有更好的查詢性能和更小的存儲空間。

And查詢

本文先用直觀的圖形方式展示and查詢時的方式,這也是算法要解決的問題核心。
通常在OLAP數據查詢時,需要進行and處理,例如你需要獲取 year = 2017 and customer = 13 的數據,這在列存儲中實際是對值 year的2017這個列和 customer的13列進行and操作,而這些列一般都使用位圖的方式存儲。
市面上有很多位圖的存儲方式,比如WAH, EWAH, Concise和Roaring Bitmap。他們有各自的優缺點,今天我設計的就是一個新的存儲方法,我給他起了一個名字,MaxMinT。
OLTP數據也是如此,只不過OLTP通常使用行存儲而不是列存儲,因此不適合此算法。
下圖展示了這兩個列的數據抽象概念,空白的區域表示全部都是0的數據,而陰影的部分表示具有比較密集的有效數據的區域。當進行and 操作時,結果就是紅色原因部分的區域,即共同擁有的部分。

爲找到這些紅色區域,我們首先從開頭的位置創建一條線,從程序上來說就是創建一個遊標,初始化爲0。

檢測所有參與and運算的列,在這個案例中只有兩個列year.2017和customer.13,順序掃描這些列,確定列是否處於空白區域,如果是,那麼獲得到此空白區域的最下端位置nextPos,如果陰影區域,不用計算下端位置。

如果至少有一列處於空白區域,那麼獲取到nextPos的最大值,將遊標移動到此位置,表示這些位置沒有任何輸出結果,如下圖所示。



現在,繼續重複剛纔的掃描,由於當前位置沒有任何一個列處於空白區域,那麼就獲取這些列的陰影最下端位置,現在我們獲取這些陰影區域的最小值,將遊標移動到此位置,那麼這個區域就是有效的區域,作爲and的輸出結果,如下圖所示。

重複此操作,直到文件的末尾。

 我將在第二章介紹數據的存儲方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章