Oracle位图索引与B-Tree索引的优缺点

位图索引简介

Bitmap 索引适用于键值大量重复的列的查询。


Bitmap 索引对索引列的每一个键值分别索引。对于一个键值,可能分成一到多个范围进行存储。
每个键值的存储范围大致包括以下几个部分。首先是索引的键值,接着存放当前范围的起始rowid
和终止rowid,最后是这个键值在这个范围内的位置编码。将这个十六进制编码转化为二进制后,
编码值是1 的代表记录符合索引的键值,是0 则表示不符合。由于保存了起始和终止的rowid 以
及在这个范围内的位置变化,因此通过转换,Bitmap 索引也可以对应到rowid。所以,Bitmap 索
引可以提供和B-Tree 索引相同的功能。


位图索引区别于传统B*树索引有两个结构特点:其一是叶子节点上是一个可能的索引列取值对应一个叶子节点。另一个就是叶子节点上通过一个位图向量表示对应行是否取定这个索引值。


位图索引主要用于决策支持系统或静态数据,不支持索引行级锁定,如果是并发操作高的系统,不适合使用位图索引。

位图索引的优势 

使用位图向量记录对应行的取值情况不仅可以带来存储空间上的节省,而且可以借助计算机位图运算的快速特性来提高索引结果利用率。下面我们通过模拟情况来进行分析。

 

Bitmap Index模拟说明

 

假设存在数据表T,有两个数据列A和B,取值如下。


序号

A

B

1

L

1

2

T

2

3

L

2

4

M

1


对两个数据列
A、B分别建立位图索引:idx_t_bita和idx_t_bitb。两个索引对应的存储逻辑结构如下: 

 

Idx_t_bita索引结构,对应的是叶子节点:

 

索引键值

起始rowid

结束rowid

位图向量

L

xxx

ttt

1010

T

xxx

ttt

0100

M

xxx

ttt

0001

 

Idx_t_bitb索引结构,对应的是叶子节点:

 

索引键值

起始rowid

结束rowid

位图向量

1

xxx

ttt

1001

2

xxx

ttt

0110

 

 

 

 

 

对查询“select * from t where b=1 and (a=’L’ or a=’M’)”

 

分析:位图索引使用方面,和B*索引有很大的不同。B*索引的使用,通常是从根节点开始,经过不断的分支节点比较到最近的符合条件叶子节点。通过叶子节点上的不断Scan操作,“扫描”出结果集合rowid

 

而位图索引的工作方式截然不同。通过不同位图取值直接的位运算(与或),来获取到结果集合向量(计算出的结果)。

 

针对实例SQL,可以拆分成如下的操作:

 

1、a=’L’ or a=’M’

 

a=L:向量:1010

a=M:向量:0001

 

or操作的结果,就是两个向量的或操作:结果为1011。

 

2、结合b=1的向量

 

中间结果向量:1011

B=1:向量:1001

 

and操作的结果,1001。翻译过来就是第一和第四行是查询结果。

 

3、获取到结果rowid

 

目前知道了起始rowid和终止rowid,以及第一行和第四行为操作结果。可以通过试算的方法获取到结果集合rowid。

 

上面的操作演算过程,说明了两个问题:

 

位图索引是可以多索引共同合作操作的,不像B*树索引只有一个会加入结果集合;

位图索引的工作是通过位逻辑运算,非扫描操作;


实际试验

 

下面我们通过一系列的实验,来进一步观察结果。

 

实验环境构建

 

 

SQL> create table t as select owner owner1, object_type type1, owner owner2, object_type type2 from dba_objects;

Table created

 

SQL> desc t;

Name   Type         Nullable Default Comments

------ ------------ -------- ------- --------

OWNER1 VARCHAR2(30) Y                        

TYPE1  VARCHAR2(19) Y                        

OWNER2 VARCHAR2(30) Y                        

TYPE2  VARCHAR2(19) Y                        

 

SQL> create index idx_t_owner1 on t(owner1);

Index created

 

SQL> create index idx_t_type1 on t(type1);

Index created

 

SQL> create bitmap index idx_t_owner2bit on t(owner2);

Index created

 

SQL> create bitmap index idx_t_type2bit on t(type2);

Index created

 

SQL> exec dbms_stats.gather_table_stats(user,'T',cascade => true);

PL/SQL procedure successfully completed

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值