天天看點

Greenplum列存壓縮表索引機制

列存壓縮表,簡稱aocs表

執行計劃如下:

我們看到使用bitmap index scan索引掃描

索引頁包含記錄的tid,而tid包含segfileno和rownum資訊,通過segfileno可以定位到檔案,通過rownum可以定位到block及具體值。

對于索引,gp将會建立一個pg_aoblkdi_oid輔助表(block directory),裡面包含每個block在檔案的偏移位置fileoffset、segfileno、firstrownum,并在firstrownum列上建立索引,隻要給出一個rownum,通過索引在pg_aoblkdi_oid輔助表中可以快速得到block在檔案的偏移位置fileoffset,然後取出資料。

為什麼aocs表使用的索引方法是bitmap index scan,而不是我們常見的index scan呢?

ao表的掃描方向隻能從前往後,而不能從後往前,heap表從前往後、從後往前都是支援的。通過索引找到的資料在ao檔案位置并不是從前往後順序的。如圖所示,假設我們的條件是id<=7,通過索引找到的記錄的順序是1,3,5,7。如果是index scan,那麼就要先從fileoffset位置掃描到第三個位置找到value=1,然後繼續掃描到第四個位置value=3,然後繼續從fileoffset位置開始掃描第一個位置value=5,繼續掃描到第二個位置value=7,可以看到使用index scan可能會有多次回頭重新開始掃描,增加了io。為了避免這個問題,隻使用bitmap index scan,将會先掃描所有滿足索引的值,然後按照tid排序,按照rownum從小到大掃描,一次從前往後掃描就可以得到索引對應的值了。

Greenplum列存壓縮表索引機制

繼續閱讀