2015-10-13 35 views
5

的PostgreSQL 9.4Undestanding位圖索引

我剛面臨稱爲Bitmap Index Scan節點和所謂的底層位圖數據結構的概念提到in this post。據我所知,PostgreSQL不支持創建位圖索引。

問:所以我們需要使用位圖數據結構,以便隨時進行Bitmap Index Scan我們需要先建立它或PostgreSQL建設btree指數的過程中創建並重建其表的任何時間改變?

回答

21

頁面位圖是爲每個查詢動態創建的。它不被緩存或重新使用,並且在位圖索引掃描結束時被丟棄。

由於的內容取決於查詢謂詞,因此預先創建頁面位圖沒有任何意義。

說你正在尋找x=1 and y=2。您在xy上有b-tree索引。 PostgreSQL不會將xy組合成位圖,然後搜索位圖。它會掃描索引x以獲取所有頁面的頁面地址,其中x=1將生成一個位圖,其中可能包含x=1的頁面爲真。然後它掃描y查找頁面地址,其中y可能等於2,從中創建一個位圖。然後它和他們找到x=1y=2可能是真的頁面。最後,它掃描自己的表格,只讀取可能包含候選值的頁面,讀取每個頁面並僅保留行數爲x=1 and y=2

現在,如果您正在尋找像緩存的預構建位圖索引之類的東西,PostgreSQL 9.5中就有這樣的事情:BRIN indexes。這些適用於非常大的表格,並且提供了一種查找可以跳過的表格範圍的方法,因爲它們已知不包含所需的值。

2

數據頁面的位圖是根據需要(每個查詢)從索引或更多索引創建的。它用於索引返回的行數少於或多於兩個索引時使用相同的關係。位圖的內容控制應該處理哪些頁面以及應該跳過哪些頁面。

此掃描方法的基本要求是表格上的現有索引。

+0

那麼,我們從零開始構建結構_任何時候我們需要做'位圖堆掃描'? –

+0

不,這對用戶是透明的。 –