B树索引与位图索引

一、 B树索引的缺陷

  在实际工作中,B树索引是Oracle数据库中最常用的一种索引。如在使用Create Index语句创建索引的时候,默认采用的就是B树索引。在B树索引中,是通过在索引中保存排序过的索引列以及其对应的Rowid列的值来实现的。不过对 于某些比较特殊的情况,如基数比较小的列,使用这个B树索引反而会降低数据库的查询效率。

  基数在Oracle数据库中指的是某个列可能拥有的不重复数值的个数。如上图为例,SEX指员工的性别,一般就只有男女两个值(其中1代表男、 0代表女),其基数就为2。假设企业要组织公司所有的女员工出去旅游,作为三八妇女节的礼物。为此就需要查询出公司所有女员工的信息。此时如果在性别列上 加入B树索引,那么反而会得到适得其反的效果。查询效率不但没有提升,反而下降。

  在这些基数比较小的列上创建B树索引并对其进行查询的话,系统就会返回大量的记录。因而这并不是具有高度选择性的索引,并不能够显着提高查询的速度。当然并不是说B树索引不好,而是指其没有用对地方。

  二、 位图索引的特点以及使用时机

  在数据库中(包括Sql Server数据库),对于这种基数比较小的列,如果只有有限的几个固定值,如上表中的性别、婚姻状况等等,要为其建立索引的话,采用的就应该是位图索引,而不是B树索引。

  位图索引为什么可以提高基数比较小的表的查询速度呢?这主要是因为在创建位图索引的时候,数据库往往会对整个表进行扫描,并未索引列的每个取值 建立一个位图(位图索引的名字也由此而来)。在这个位图中,为表中的每一行使用一个位元来表示该行是否包含该位图的索引列的取值。位元到行的ROWID的 对应关系通过位图索引中的应收函数来完成。如此的话,位图索引就能够以一种完全不同的内部机制来完成与B树索引相同的功能。

  另外值得一提的是,对于B树索引而言,如果在查询条件语句中采用了AND等操作符号,其查询的效率会大打折扣。故在数据库优化中,会建议大家不 要使用这些操作符,改用其他操作符代替。不过如果采用位图索引的话,则没有这方面的顾虑。如上例所示,假设用户需要查找已婚的女性,那么就可以使用如下的 语句查询。

  select t.*, t.rowid

  from userinfo t

  where t.merital=’已婚’ and t.sex=0

  这个查询引用了一些创建了位图索引的列时,这些位图可以很方便的与AND或者OR操作符结合以找出想要的数据。数据库在后台处理的时候,先利用 已经创建的位图进行逻辑运算,然后计算结果位图中1的个数,就可以查询到满足条件的所有记录。如果查询到结果后还需要更改数据的话,那么只需要按照结果位 图中取1的位元对应的ROWID列的值进行映射即可。

  三、 位图索引的使用限制

  位图索引虽然在某些情况下能够起到比B树索引更好的效果。但是需要注意的是,并不是在任何场合都有效。如上例所示,如果在员工编号或者员工姓名 列中使用的话,反而会降低数据查询的效率。故其使用仍然受到比较大的限制。如上面列举的案例,一般情况下只有在“基数比较小的列中”和“需要使用与和或的 运算中”采用位图索引能够起到比B树索引更好的效果。其他情况还是使用B数索引或者函数索引为好。

  在Oracle数据库中,有B树索引、位图索引、函数索引等等。具体采用哪种索引,还是要根据不同的情形来对待。随着数据库应用越来越复杂,单 靠一个B树索引已经不能够应付了。如列中包含了表达式或者函数的话,B树索引或者位图索引都不能够用,只有用函数索引。对于数据库专家来说,索引的创建与 管理或许没有难度,只需要简单的几个语句即可。比较困难的是,如何根据实际情况来选择合适的索引。

b-tree  索引 是 当在一个表的某个字段或者某几个字段上 (叫 key value )建立索引时候,oracle 会把这一个或几个字段全部读出来,包括 key value 所在行的 rowid , 然后排序,缺省是 升序,从小到大, 唯一性索引就按照key value 排序,如果是非唯一性索引,就是 key value +  该行所在的 rowid 排序。
然后 将这些数据写入到 索引块 里面去 。 然后就生成了 b-tree 索引.
用在选择性高 /或者叫 基数高的情况下, oltp 类型

bitmap 索引是 用 bitmap 来表示 相关的key value 。 例如 如果一个字段(列)上的值 是  男/女 ,或者 结婚/未婚/离异,或者 地区 : 北京/上海/广州。
建立索引的列上 有几个这个的值,该表就会 有几个 bitmap ,set 置位 1 就表示 该行的值是相应的值。  通过 maping function 来获得具体的rowid值

例如 表 有5行数据, 地区 , 建立bitmap
北京: 10010
上海:   01001
广州:   00100

用在选择性低, 基数低的情况,  不同的值小于1% , 或者 重复数量大于100个,就可以考虑 bitmap索引。
bitmap 索引在 datawarehousing 数据仓库中较多应用。

位图索引用在选择性低, 基数低的情况,  不同的值小于1% , 或者 重复数量大于100个,就可以考虑 bitmap索引。

猜你喜欢

转载自talentluke.iteye.com/blog/1840766