索引页块碎片(Index Leaf Block
Fragmentation)
这篇文章将会回答如下问题:
什么是索引页块碎片?什么时候被重用?
什么是半空索引碎片?什么时候被重用?
oracle的标准索引结构是B×tree结构,一个B×tree结构由三种block组成
根块(root
block):在B×tree里有且只有一个block,所有访问索引都从这开始,root block下有很多child
blocks。
分支块(Branch blocks):这是中间层,branch
block是没有什么限制的,它是随着leaf block的增加而增加的,branch
block一般是4层,如果多于4层,就影响性能了。在我们删除行时,branch block是不被删除的。
叶块(leaf
block):叶块是最底层,上面存储着索引条目和rowid
索引和表数据是级联关系的,当删除表数据的时候,索引条目也会被自动删除,这样在index leaf
block就会产生碎片,这也就是在OLTP系统上有大量更新的表上不建议创建大量的索引,很影响性能
有的人说删除过的索引条目空间不会被再用,因为在应用中不会再有insert相同的数据。其实这个
说法不完全对的,除了半空叶块外,其他的删除的索引空间是可被再利用的。
eg:
本文的所有实验都是在如下平台测试:
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 -
Prod
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for 32-bit Windows: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production
SQL>
SQL> create table test_idx as
select seq_test.nextval id,2000 syear, a.* from d
ba_objects a;
表已创建。
SQL> insert into test_idx select seq_test.nextval id,2001 syear, a.* from dba_o
bjects a;
已创建50780行。
SQL> insert into test_idx select seq_test.nextval id,2002 syear, a.* from dba_o
bjects a;
已创建50780行。
SQL> commit;
提交完成。
SQL> desc test_idx
名称 是否为空? 类型
-----------------------------------------
-------- ----------------------------
ID NUMBER
SYEAR NUMBER
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID