2010-08-10 58 views
28

Wikipedia給出了這樣的例子位圖索引如何提供幫助?

Identifier Gender   Bitmaps 
           F M 
1   Female   1 0 
2   Male    0 1 
3   Male    0 1 
4   Unspecified  0 0 
5   Female   1 0 

但我不明白這一點。

  • 首先這是一個索引?是不是索引應該指向行(使用rowid的)給定的關鍵?
  • 什麼是典型的查詢這樣的索引是有用的?它們如何比B-tree索引更好?我知道如果我們在Gender這裏使用B樹索引,我們會得到很多結果,例如,我們尋找Gender = Male,這需要進一步過濾掉(所以不是很有用)。位圖如何改善情況?

回答

33

位圖索引的更好的表示,則如果給定上述示例:

Identifier Gender   RowID 
1    Female   R1 
2    Male   R2 
3    Male   R3 
4    Unspecified  R4 
5    Female   R5 

的上gender列的位圖索引將(在概念上)看起來像這樣:

Gender  R1 R2 R3 R4 R5 
Female  1  0 0 0 1 
Male   0  1 1 0 0 
Unspecified 0  0 0 1 0 

位圖當一列中的不同值的數量相對較低時使用索引(考慮相反的情況,所有值都是唯一的:位圖索引將與每行一樣寬,只要使它有點像一個大的身份ma TRIX。)

與該指數的地方查詢像

SELECT * FROM table1 WHERE gender = 'Male' 

數據庫查找在索引中的性別價值觀匹配

所以,找到所有在位被設置爲1的rowid,和然後去獲得表結果。

喜歡的查詢:

SELECT * FROM table1 WHERE gender IN ('Male', 'Unspecified') 

會得到男性的1位,用於在未指定1位,做一個按位或然後去獲得,其中所得位是1

行因此,在ab *樹索引上使用位圖索引的優點是存儲(基數小,位圖索引非常緊湊),並且能夠在解析實際的rowid之前進行按位操作,這很快。

請注意,位圖索引可能會對插入/刪除產生性能影響(從概念上說,您向位圖中添加/移除列並相應地重新調整列...),並且可能會創建大量爭用作爲更新在一行中可以鎖定整個對應的位圖條目,並且無法更新另一行(具有相同的位圖值),直到提交/回滾第一個更新。

+0

數據庫會掃描整個位圖的'未指定'來搜索所有相應的行或有一些查找結構的情況嗎? – Beginner 2017-03-16 11:07:41

+1

@Beginner,請參閱「位圖存儲結構」:https://docs.oracle.com/database/121/CNCPT/indexiot.htm#CNCPT88851 – 2017-03-16 18:05:50

+0

這是我讀過的最好的解釋爲什麼位圖索引可能是有用。然而,我仍然不清楚爲什麼當僅搜索一列**時,位圖索引比正常的B樹索引更好。 b-tree索引也應該允許我快速確定與「Male」或「Female」或「Male |」對應的行的子集。未指定',對嗎? – 2017-04-01 04:07:12

4

正如維基百科文章中所指出的那樣,它們使用按位運算,它可以比比較數據類型(如整數)更好地執行,所以簡短答案就是提高查詢速度。

從理論上講,它應該佔用更少的計算時間和更少的時間來選擇您的示例中的所有男性或所有女性。

只要想一想這是如何在引擎蓋下工作的,應該說明爲什麼這更快顯而易見。有一點在邏輯上是真或假。如果您想使用WHERE子句執行查詢,那麼最終將對記錄求值爲true或false,以確定是否將它們包含在結果中。

前言 - 這剩下的,就是要外行的燕鷗和非技術人員

因此,接下來的問題是,怎樣才能評估爲真?即使是比較數值意味着計算機有...

  1. 分配內存要評估
  2. 分配內存控制值
  3. 賦值給每個(算上這兩個值步驟)
  4. 比較兩個 - 對於數字,這應該是快速的,但對於字符串,有更多的字節進行比較。
  5. 將結果賦值爲0(假)或1(真)值。

重複如果您使用多部分where子句諸如在哪裏「這個=這個那個=認爲」

  • 上所產生的結果執行位操作第5步
  • 拿出最終值
  • 解除分配內存使用逐邏輯步驟1-3
  • 但分配的,你只是在看0(假)和1(真)值。比較工作的90%的開銷被消除了。

    12

    在對多列進行過濾時,可以在實際選擇數據之前將相應的索引與位操作進行合併。 如果你有性別,eye_colour,hair_colour 那麼查詢

    select * from persons where 
             gender = 'male' and 
             (eye_colour = 'blue' or hair_colour = 'blonde') 
    

    會首先做一個按位或eye_colour [「藍色」]指數和hair_colour [「金髮女郎」]指數之間終於按位之間的結果和性別['男性']指數。這個操作在計算和I/O方面都非常快。
    生成的比特流將用於拾取實際行。

    位圖索引通常用於數據倉庫應用程序中的「星型連接」。