9.2.6 位图(Bitmap)索引
http://space.itpub.net/9842/viewspace-343286
位图索引是另外一个索引类型,组织形式和b-tree索引相同,也是一颗平衡树,区别
在于叶子节点里存放索引条目的方式不同。前面知道,B数索引的叶子节点对于表里
的每个数据行,如果索引列的值不为空,则会为这个记录行在叶子节点中维护一个
对应的索引条目。 而位图索引则不是这样,叶子节点中存放的索引条目如下:
http://space.itpub.net/9842/viewspace-343286
位图索引非常适用于DSS及数据仓库系统,他们可以使用较少的基数(唯一键数目,
比如男和女,基数为2)列,访问非常大的表,尽管位图索引最多可以达到30个列,
但是一般都只用于少量的列。对于那些有较低基数的列要使用位图索引。位图索引
对于低基数(少量不同值)的列来说非常快,这是因为索引的大小相对于B树索引来说
小很多,因为这些索引是低基数的B树索引。
在表上建立索引后,位图索引条目上(叶子节点中)还包含表里第一条记录所对应的rowid
及最后一条记录所对应的rowid, 所以条目的最后一部分则是由多个bit位组成的bitmap,
每个bit位就对应一条记录。 格式:
key start rowid end rowid bitmap
<01, AAAAAA , ZZZZZZ , 1000100100011001001 >
<02, AAAAAA , ZZZZZZ , 0101100100011100010 >
<03, AAAAAA , ZZZZZZ , 0000100101101001001 >
bitmap中没有直接记录rowid, 而是记录了一个位图, 位图中的每一个bit位都对应一个rowid,
之间有转换关系的.所以用bitmap索引的时候你可以在执行计划里看到 bitmap to rowid 这样的步骤.
当我们发出where c1='01'这样的SQL时,oracle会搜索01所在的索引条目,然后扫描该
索引条目中的bitmap里的所有bit位。第一个bit位是1,表示第一条上的c1的值是01,
于是返回第一条记录所在的rowid(根据该索引条目里记录的start rowid加上行号得到
该记录所在的rowid), 第二个bit位为0, 则说明第二条记录上的c1值不为01,依此类推。
特别注意,如果索引列为空,也会在位图索引中记录,对应的bit位为0 ;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-687520/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-687520/