对于索引块的分裂,虽然早有了解,但一直没有经过试验验证。
今天总算是验证了一把。
以下为验证过程:
1、创建测试表与索引
DROP TABLE T PURGE;
CREATE TABLE T(C VARCHAR2(1000));
CREATE INDEX IDX_T_C ON T(C);
2、查看索引存储的Extents,后期dump用
SELECT FILE_ID, BLOCK_ID, BLOCKS FROM DBA_EXTENTS WHERE SEGMENT_NAME='IDX_T_C';
3、未插入数据之前,dump索引extent数据
4、由于db_block_size=8192,而索引字段大小为1000,故此大约可以存储7条记录。
所以本步我们先插入7条记录,依次为 111 ~ 117
5、dump插入数据之后的索引extent
6、插入记录118,并dump索引extent
7、插入数据119~125,并dump索引extent
8、插入数据 126,并dump索引extent
9、插入数据110,并dump索引extent
10、插入数据122,并dump索引extent
11、一步步得出索引变化图,对比分析索引分裂的原理:
90-10分裂:
产生的条件:
1、插入的行需要记录到本索引块
2、本索引块中没有足够空间
3、新插入的行大于本索引块中的所有记录。
分裂的过程:1、申请一个新索引块
2、将所有原索引块中的数据保留在原索引块中
3、将新的行记录插入到新申请的索引块中
4、更新上级索引块(Branch Block)
50-50分裂:
产生的条件:
1、插入的行需要记录到本索引块
2、而本索引块中没有足够空间
3、且新插入的行不大于本索引中的所有记录。
分裂过程:
1、新申请一个新的索引块
2、将原索引块中较大的部分数据转移到新索引块中
3、将新值插入合适的索引块中
4、更新上级索引块(Branch Block)
索引块内容变化图:
-- to be continued --
index_split .jpg
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24465008/viewspace-753356/
,如需转载,请注明出处,否则将追究法律责任。