文章内容来自于位图索引
位图索引(Bitmap Indexes)是一种使用位图的特殊数据库索引。它针对大量相同值的列而创建,例如:类别、型号等。位图索引块的一个索引行中存储的是键值(以比特位0、1的形式存储)和起止ROWID(ROWID的内容可以参考【3.2.28 ROWID和ROWNUM有什么区别?】),以及这些键值的位置编码,位置编码中的每一位表示键值对应的数据行的有无。一个块可能指向的是几十甚至成百上千行数据的位置。
在位图索引中,数据库为每个索引键存储一个位图。在传统的B-Tree索引中,一个索引条目指向单个行,但是在位图索引中,每个索引键存储指向多个行的指针。相对于B-Tree索引,位图索引占用的空间非常小,创建和使用速度非常快。当根据键值查询时,可以根据起始ROWID和位图状态,快速定位数据。当根据键值做AND、OR或IN (X,Y,..)查询时,直接用索引的位图进行或运算,快速得出结果集。当SELECT COUNT(XX)时,可以直接访问索引从而快速得出统计数据。
位图索引与其它索引不同,它不是存储的索引列的列值,而是以比特位0、1的形式存储,所以在空间上它占的空间比较小,相应的一致性查询所使用的数据块也比较小,查询的效率就会比较高。所以,一般应用于即席查询和快速统计条数。由于位图索引本身存储特性的限制,所以,在重复率较低的列或需要经常更新的列上是不适合建立位图索引的。另外,位图索引更新列更容易引起死锁。
创建位图索引的语法很简单,就是在普通索引创建的语法中的INDEX前加关键字BITMAP即可,如下所示:
CREATE BITMAP INDEX IDX_SEX_LHR ON T_USER(SEX);
关于位图索引,需要了解以下几点内容:
① 位图索引适合创建在低基数列(即列值重复率很高)上。
② 适合于决策支持系统(DSS)或OLAP系统。位图索引主要用于数据仓库,或在以特定方式引用很多列的查询环境中。位图索引并不适合许多OLTP应用程序,若使用不当则容易产生死锁。
③ 被索引的表是只读的,或DML语句不会对其进行频繁修改的表。
④ 非常适合OR操作符的查询。
⑤ 位图索引不直接存储ROWID,而是存储字节位到ROWID的映射。
⑥ 减少响应时间。
⑦ 节省空间占用。
⑧ 在同一列上建立位图索引后就不能再建立普通索引了,但是可以建立函数索引,位图索引可以和函数索引同时建立。
⑨ 做UPDATE代价非常高。
⑩ 基于规则的优化器不会考虑位图索引。
⑪ 当执行ALTER TABLE语句并修改包含有位图索引的列时,会使位图索引失效。
⑫ 位图索引不包含任何列数据,并且不能用于任何类型的完整性检查。
⑬ 位图索引不能被声明为唯一索引。
⑭ 位图索引的最大长度为30。
可以使用如下的SQL语句查询数据库中的所有位图索引:
SELECT * FROM DBA_INDEXES D WHERE D.INDEX_TYPE='BITMAP';
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/14467.html