位图索引主要针对大量相同值的列而创建索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码,位置编码中的每一位表示键值对应的数据行的有无.一个位图索引块可能指向的是几十甚至成百上千行数据的位置.

位图索引的特点
1.Bitmap索引的存储空间
相对于B*Tree索引,位图索引由于只存储键值的起止Rowid和位图,占用的空间非常少.
2.Bitmap索引创建的速度快
位图索引创建时不需要排序,并且按位存储,所需的空间也少.B*Tree索引则在创建时需要排序,定位等操作,速度要慢得多.
3.Bitmap索引允许键值为空
B*Tree索引由于不记录空值,当基于is null的查询时,会使用全表扫描,而对位图索引列进行is null查询时,则可以使用索引.
4.Bitmap索引对表记录的高效访问
当使用count(XX),可以直接访问索引就快速得出统计数据.当根据位图索引的列进行and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,在访问数据之前可事先过滤数据.
5.Bitmap索引对批量DML操作只需进行一次索引
由于通过位图反映数据情况,批量操作时对索引的更新速度比B*Tree索引一行一行的处理快得多.
6.Bitmap索引的锁机制
对于B*Tree索引,insert操作不会锁定其它会话的DML操作.
而位图索引,由于用位图反映数据,不同会话更新相同键值的同一位图段,insert、update、delete相互操作都会发锁定。
位图索引的适用场合
1.基于规则的优化器无法使用Bitmap索引
2.适应于有大量重复值的列查询
3.由于并发DML操作锁定的是整个位图段的大量数据行,所以位图索引主要是用于OLAP应用,也可以用于OLTP中主要为读操作的表.
4.一般情况下只有在“基数比较小的列中”和“需要使用与和或的运算中”采用位图索引能够起到好的效果。
位图索引在读密集的环境中能很好地工作,但是对于写密集的环境则极不适用。原因在于,一个位图索引键条目指向多行。如果一个会话修改了所索引的数据,那么在大多数情况下,这个索引条目指向的所有行都会被锁定。Oracle无法锁定一个位图索引条目中的单独一位;而是会锁定这个位图索引条目。倘若其他修改也需要更新同样的这个位图索引条目,就会被“关在门外“。这样将大大影响并发性,因为每个更新都有可能锁定数百行,不允许并发地更新它们的位图列。
位图索引为什么可以提高基数比较小的表的查询速度呢?这主要是因为在创建位图索引的时候,数据库往往会对整个表进行扫描,并未索引列的每个取值建立一个位 图(位图索引的名字也由此而来)。在这个位图中,为表中的每一行使用一个位元来表示该行是否包含该位图的索引列的取值。位元到行的ROWID的对应关系通 过位图索引中的应收函数来完成。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29337971/viewspace-1063519/ ,如需转载,请注明出处,否则将追究法律责任。