ORACLE 窥视索引内部结构(下)

作者简介:孙显鹏,Oracle 十年从业经验,拥有11G ocp认证,精通内部原理,擅长调优,解决疑难问题,致力于帮助客户解决生产过程过出现的性能问题,提高生产效率!爱好书法!

位图索引–反转索引

准备环境和测试数据

位图索引:

注意这里的BLEVEL=0

trace 信息:

位图索引需要注意应用场景和DML操作的影响范围。

反转索引:

我们建立一个普通反转索引看看其内部结构:

打印数据块:01 81 8c af 00 00

从trace信息可以看到,反转索引就是将键值dump值倒过来存储,并不是十进制1倒过来还是1这个要注意,这样做有什么目的呢?什么时候应用反转索引呢?有什么限制?因为我们测试数据较少,如果大量数据你会看到索引键值被打散到索引块中,这样就消除了单行递增带来的连续值在同一个索引块中的热点索引块。但是反转索引不能采取范围扫描,这是他的限制,需要注意。

倒叙索引

倒叙索引内部结构是什么样子,是不是索引键值就是倒叙排列呢?答案肯定不是,因为oracle不可能为索引建立两个不同的结构。

环境准备:

分析枝节点:

我们分析下:

从分支节点可以看到叶节点还是按照升序排列的,但是分支节点临界值并不是id列的实际值,3d 9f cb 这些值是怎来的呢?

我们看看第一个叶节点:

我们查看第一个叶子信息:

10000的dump值为 c3 02 ,但是在倒叙索引下的键值却变成了3c fd ff,oracle内部做了加工处理。加工处理的结果3c fd ff在索引内部是最小值。

也就是说id=1的c1 02通过倒叙索引id变成了3e fd ff,而3e fd ff在所有索引键值中却变成了最大值。

我们看看这个值是什么意思:

61 开头应该是负数,计算方式为:

指数=62-61=1

数字1= (101-253)*100^(1-0) = -152*100=-15200

FF 应该有特殊含义,其实注意到col 0; len 3; (3):这个括号里的3不是number型,number型应该为2才对,这个可能有特殊含义。到目前为止我还不清楚该计算方式。负数应该是以102结尾。

比如正常-10000的oracle内部 100进制表示方式应该是:

指数=62-60=2

数字1 =(101-100)*100^2=1*10000

102 代表-号

这个问题有待于深入研究!

下面是正常索引的信息,可以作为对比参考。

 

 

未经允许不得转载:Oracle一体机用户组 » ORACLE 窥视索引内部结构(下)

相关推荐