位图索引的更好的表示,则如果给定上述示例:
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