首页 > Oracle > Oracle 索引dump实验(索引块的分裂,索引的存储,叶子节点的变化)!
2013
08-24

Oracle 索引dump实验(索引块的分裂,索引的存储,叶子节点的变化)!

本文只介绍索引的几个dump小实验。电脑终于弄好了。X东还是不错的嘛,给哥换了个新电源。NND。
问:oracle 的插入最小值的时候,索引是55拆分还是91拆分?插入最大值呢?
答:当插入最小值的时候,索引块是55拆分,插入最大值的时候,索引块是91拆分,请看下面的实验。

然后分析一下索引,看一下索引的块数,高度
然后看一下表中的最小值是多少,插入比最小值还小的数据

然后再对索引进行dump
查看一下dump的文件,从下面的对比可以看到,插入最小值的时候,索引是55拆分
下面我们来看一下插入最大值,索引的分裂情况,找到当前最大值后,插入1000条比最大值还大的数据
然后进行索引的dump,查看对比,可以看到插入最大值的时候,索引块是9-1拆分,就是相当于块满了以后直接新增的块来存储索引
下面我们简单看一下leaf对应的是哪个块,也就是说存储的数据是多少?我们拿   leaf: 0x18015e5 25171429 (204: nrow: 174 rrow: 174)作为例子,dump索引的叶子节点:
说明一下get_fb函数是自己创建的,调用了dbms_utility包,对16位的节点地址进行了一个转换,然后输出文件号和块号
这里也可以看到,dump文件中的第二列是16位的节点地址,第三列是10位的节点地址,第5列(nrow)表示当前节点所含索引条目的数量(包括delete的条目),第七列(rrow):表示有效索引条目的数量,因为索引条目如果被删除,不会立即被清除出索引块中。所以nrow减rrow的数量就表示已经被删除的索引条目
SQL> select to_number(‘18015e5′,’xxxxxxxxxxx’) from dual;
TO_NUMBER(‘18015E5′,’XXXXXXXXXXX’)
———————————-
25171429
 
然后执行上面的dump command:
查看dump的trace文件,可以看到索引块存储的值,要经过换算一下
然后我们看一下row#0对应的值是多少,我们先看一下col 0用这个转换一下
我们可以在表中查询到这条数据
上面可以得出col 0 表示存储的键值,那col 1呢,可以想到col 1就是rowid了,下面我们看一下这个col 1
首先得到这条数据的块号,行号
然后查询jerry表的object_id,然后通过rowid_create函数进行转换,dbms_rowid.rowid_create(‘1’,93267,6,5331,276)说明:1是固定的,93267表示对象(表)的object_id,这里要注意一定要是表的object_id,别弄成索引的object_id了,6,6331,276就是上面查询出来的块号和行号信息了
这里我们得出rn=92327这一行对应的rowid是AAAWxTAAGAAABTTAEU,下面我们来查询一下表里面的rowid
这2个rowid是一样的,可以看出col 1存储的就是我们表中的rowid值

然后我们看一下dump索引的trace
然后我们删除1/3的数据后,再进行一个dump
我们看一下删除数据后的dump文件
这里我们看到2个trace文件的对比,删除数据后的rnow != rrow,前面我们已经提到过这2个值的意思,我们再来看一下:
(nrow)表示当前节点所含索引条目的数量(包括delete的条目),(rrow):表示有效索引条目的数量,因为索引条目如果被删除,不会立即被清除出索引块中。所以nrow减rrow的数量就表示已经被删除的索引条目。
删除后的rrow少了,说明的实际存储键值的,nrow里面包含了delete的条目,每个leaf少了1/3,因为我们就是删的1/3的数据,下面我们来看一下索引的叶子节点情况,我们以  leaf: 0x180126e 25170542 (1: nrow: 35 rrow: 24)为例:

然后查看trace文件,可以看到文件中有的地方有一个D标识符,代表这行已经删掉了,但在索引的块中只是打了一个标志位,这也是索引碎片产生需要rebuild的原因
我们取row#2[7993] flag: —D—, lock: 2, len=13这个为例,查询一下对应的值,我们可以看到表中的数据已经删掉,索引块中只是标志了一个delete状态
这里大家也可以想象一下update表数据的情况,索引块中是delete+insert,也就是说会先将这行标示为删除,然后重新插入一个叶子块,我就不做实验了,困
最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL