位圖索引的更好的表示,則如果給定上述示例:
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之前進行按位操作,這很快。
請注意,位圖索引可能會對插入/刪除產生性能影響(從概念上說,您向位圖中添加/移除列並相應地重新調整列...),並且可能會創建大量爭用作爲更新在一行中可以鎖定整個對應的位圖條目,並且無法更新另一行(具有相同的位圖值),直到提交/回滾第一個更新。
數據庫會掃描整個位圖的'未指定'來搜索所有相應的行或有一些查找結構的情況嗎? – Beginner 2017-03-16 11:07:41
@Beginner,請參閱「位圖存儲結構」:https://docs.oracle.com/database/121/CNCPT/indexiot.htm#CNCPT88851 – 2017-03-16 18:05:50
這是我讀過的最好的解釋爲什麼位圖索引可能是有用。然而,我仍然不清楚爲什麼當僅搜索一列**時,位圖索引比正常的B樹索引更好。 b-tree索引也應該允許我快速確定與「Male」或「Female」或「Male |」對應的行的子集。未指定',對嗎? – 2017-04-01 04:07:12