专栏首页小麦苗的DB宝专栏【DB笔试面试551】在Oracle中,位图索引是什么?

【DB笔试面试551】在Oracle中,位图索引是什么?

题目部分

在Oracle中,位图索引是什么?

答案部分

位图索引(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';

本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。

本文分享自微信公众号 - DB宝(xiaomaimiaolhr),作者:小麦苗best

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【DB笔试面试352】什么是不可用索引(Unusable Indexes),哪些操作会导致索引变为不可用即失效状态?

    在Oracle数据库中,什么是不可用索引(Unusable Indexes),哪些操作会导致索引变为不可用(unusable)即失效状态?

    小麦苗DBA宝典
  • 【DB笔试面试553】在Oracle中,什么是不可见索引?

    索引维护是DBA的一项重要工作。当一个系统运行很长一段时间,经过需求变更、结构设计变化后,系统中就可能会存在一些不再被使用的索引,或者使用效率很低的索引。这些索...

    小麦苗DBA宝典
  • 【DB笔试面试549】在Oracle中,单列索引和复合索引分别是什么?

    按照索引列的个数,索引可以分为单列索引和复合索引。单列索引是基于单个列所建立的索引。复合索引(Composite Indexes),也称为连接索引、组合索引或多...

    小麦苗DBA宝典
  • Mysql 索引

    除了b+树索引外,还有hash索引,使用hash表去实现<key,value>,对于每一行数据,存储引擎都会对所有的索引列计算出一个hash code,将has...

    猎户星座1
  • Mysql索引优化

    在我们日常使用数据库的时候,肯定避免不了对数据库的优化。那么对数据库的优化又少了不索引的知识。

    仙士可
  • 大型分布式业务平台数据库优化方法(上)

    文章摘要:一个小小的MySQL数据库B-Tree索引可能会带来意想不到的性能优化提升……

    用户2991389
  • 面试中有哪些经典的数据库问题?

    1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯...

    java思维导图
  • 24 个MySQL面试题,Java 程序员又知道多少呢?

    1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。

    lyb-geek
  • MySQL数据库建表、优化、算法、分区分库分表总结

    1、因为任何有业务含义的列都有改变的可能性,主键一旦带上了业务含义,那么主键就有可能发生变更。主键一旦发生变更,该数据在磁盘上的存储位置就会发生变更,有可能会引...

    chenchenchen
  • 面试中有哪些经典的数据库问题?

    1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯...

    Spark学习技巧

扫码关注云+社区

领取腾讯云代金券