———————————————————————-
B-树(B-tree)索引 | 位图索引
———————————————————————-
适合于high-cardinality列 | 适合于low-cardinality列
———————————————————————-
对关键字列的修改相对不算昂贵 | 对关键字列的修改非常昂贵
———————————————————————-
使用谓词AND/OR查询效率不高 | 使用谓词AND/OR查询效率高
———————————————————————-
行一级的锁 | 位图段一级的锁
———————————————————————-
较多的存储 | 较少的存储
———————————————————————-
用于OLTP | 用于DSS
———————————————————————-
在这里:
low-cardinality:就是列的值可以枚举,例如性别和婚姻状况。
high-cardinality:列的值很难枚举,如人名等。
由于位图索引所需要的存储空间要比B-树索引小得多,因此,Oracle服务器在使用位图索引时将整个位图段装入内存,这实际上是将在一个磁盘上得搜索过程变成了一个内存查找过程,从而大大地提高了系统的效率。Oracle是用初始化参数文件中的参数
CREATE_BITMAP_AREA_SIZE来定义这个内存区的大小。默认值为8MB.
其中,在位图索引中修改键值列(索引列)需要段一级的锁。而B-树索引使用的是行一级的锁,还有在这种情况下可能要调整位图,因此在位图索引中对关键字列的修改是非常昂贵的。
综上:B-树索引可能更适合于联机事务处理(OLTP)系统,因为在OLTP系统中,DML操作比较频繁。而位图索引更适合与DSS系统,因为在数据仓库系统中表都比较大而且静态的并且查询比较复杂。