索引——位图索引

位图索引非常适合于决策支持系统(Decision Support System,DSS)和数据仓库,它们不应该用于通过事务处理应用程序访问的表。它们可以使用较少到中等基数(不同值的数量)的列访问非常大的表。尽管位图索引最多可达30个列,但通常它们都只用于少量的列。

例如,您的表可能包含一个称为Sex的列,它有两个可能值:男和女。这个基数只为2,如果用户频繁地根据Sex列的值查询该表,这就是位图索引的基列。当一个表内包含了多个位图索引时,您可以体会到位图索引的真正威力。如果有多个可用的位图索引,Oracle就可以合并从每个位图索引得到的结果集,快速删除不必要的数据。

下面的程序清单给出了一个创建位图索引的例子:

create bitmap index dept_idx2_bm on dept (deptno);
Index created.

技巧:

对于有较低基数的列需要使用位图索引。性别列就是这样一个例子,它有两个可能值:男或女(基数仅为2)。位图对于低基数(少量的不同值)列来说非常快,这是因为索引的尺寸相对于B树索引来说小了很多。因为这些索引是低基数的B树索引,所以非常小,因此您可以经常检索表中超过半数的行,并且仍使用位图索引。

当大多数条目不会向位图添加新的值时,位图索引在批处理(单用户)操作中加载表(插入操作)方面通常要比B树做得好。当多个会话同时向表中插入行时不应该使用位图索引,在大多数事务处理应用程序中都会发生这种情况。

位图索引示例

下面来看一个示例表PARTICIPANT,该表包含了来自个人的调查数据。列Age_Code、Income_Level、Education_Level和Marital_Status都包括了各自的位图索引。图2-4显示了每个直方图中的数据平衡情况,以及对访问每个位图索引的查询的执行路径。图中的执行路径显示了有多少个位图索引被合并,可以看出性能得到了显著的提高。

 
(点击查看大图)图2-4  位图索引创建过程

如图2-4所示,优化器依次使用4个单独的位图索引,这些索引的列在WHERE子句中被引用。每个位图记录指针(例如0或1),用于指示表中的哪些行包含位图中的已知值。有了这些信息后,Oracle就执行BITMAP AND操作以查找将从所有4个位图中返回哪些行。该值然后被转换为ROWID值,并且查询继续完成剩余的处理工作。注意,所有4个列都有非常低的基数,使用索引可以非常快速地返回匹配的行。

技巧:

在一个查询中合并多个位图索引后,可以使性能显著提高。位图索引使用固定长度的数据类型要比可变长度的数据类型好。较大尺寸的块也会提高对位图索引的存储和读取性能。

下面的查询可显示索引类型。B树索引作为NORMAL列出;而位图索引的类型值为BITMAP。

select index_name, index_type
from user_indexes;

技巧:

如果要查询位图索引列表,可以在USER _INDEXES视图中查询index_type列。

建议不要在一些联机事务处理(OLTP)应用程序中使用位图索引。B树索引的索引值中包含ROWID,这样Oracle就可以在行级别上锁定索引。位图索引存储为压缩的索引值,其中包含了一定范围的ROWID,因此Oracle必须针对一个给定值锁定所有范围内的ROWID。这种锁定类型可能在某些DML语句中造成死锁。SELECT语句不会受到这种锁定问题的影响。

位图索引有很多限制,如下所示:

基于规则的优化器不会考虑位图索引。

当执行ALTER TABLE语句并修改包含有位图索引的列时,会使位图索引失效。

位图索引不包含任何列数据,并且不能用于任何类型的完整性检查。

位图索引不能被声明为唯一索引。

位图索引的最大长度为30。

技巧:

不要在繁重的OLTP环境中使用位图索引


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
0; } ``` 程序运行时,会显示一个菜单,让用户选择不同的功能,例如: ``` 1位索引(Bitmap Index)是一种特殊类型的索引,它使用位存储数据。对于列中的每个不同值,位索引都会创建一个位,其中每个位对应于表中的. 添加学生信息 2. 显示所有学生信息 3. 按总分排序 4. 按DataStructure成绩排序一行。如果值出现在行中,则相应的位设置为1,否则为0。通过使用位索 5. 按C成绩排序 6. 查找某一C成绩的记录 0. 退出程序 请选择操作引,可以快速地定位符合特定查询条件的行。 位索引通常用于低基数(即不同值数量较少)列上,例如性别列等。在这种情况下,位索引可以(输入数字): ``` 用户可以根据需要选择不同的功能,程序会根据用户的选择执行相应极大地减少磁盘 I/O 操作,提高查询性能。但是,如果列具有高基数(即的操作,例如: ``` 请输入学号:001 请输入姓名:张三 请输入DataStructure成绩:90 请输入不同值数量较多),则位索引的效率可能会降低。 在 Oracle 数据库中,可以使用 CREATEC成绩:80 添加成功 请选择操作(输入数字):2 学号 姓名 DataStructure C 总分 BITMAP INDEX 语句创建位索引,例如: ``` CREATE BITMAP INDEX idx_gender ON employees(gender); ``` 001 张三 90.0 80.0 170.0 请选择操作(输入数字):3 按总这将在 employees 表的 gender 列上创建一个位索引。在查询中使用位索引时,可以使用 BIT分排序结果: 学号 姓名 DataStructure C 总分 001 张三 90.0 80.0 MAP AND、BITMAP OR、BITMAP NOT 等操作符组合多个位索引,以获得更高效的查询性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值