首页 > Linux操作系统 > Linux操作系统 > 什么情况下索引会重用空间
naruto@ORCL>create table t
2 as
3 select * from all_objects
4 /
表已创建。
naruto@ORCL>select count(*) from t
2 /
COUNT(*)
----------
49964
naruto@ORCL>create index p_id on t(object_id)
2 tablespace mssm --索引要在手动段管理的表空间下创建,因为自动段管理的表空间没有freelist。
3 /
索引已创建。
使用DBMS_SPACE包中的FREE_BLOCKS过程,查看索引t_id上的freelist上有多少个块(《oracle9i&10g编程艺术》上的例子)
naruto@ORCL>declare
2 l_freelist_blocks number;
3 begin
4 dbms_space.free_blocks
5 ( segment_owner => user,
6 segment_name => 'P_ID',
7 segment_type => 'INDEX',
8 freelist_group_id => 0,
9 free_blks => l_freelist_blocks
10 );
11 dbms_output.put_line('blocks on freelist=:'||' '||l_freelist_blocks);
12 end;
13 /
blocks on freelist=: 0
PL/SQL 过程已成功完成。
可以看到索引的freelist上没有块
把object_id为偶数的行删掉,使每个索引块都有删掉的部分
naruto@ORCL>delete from t
2 where mod(object_id,2) = 0
3 /
已删除24976行。
提交完成。
naruto@ORCL>declare
2 l_freelist_blocks number;
3 begin
4 dbms_space.free_blocks
5 ( segment_owner => user,
6 segment_name => 'P_ID',
7 segment_type => 'INDEX',
8 freelist_group_id => 0,
9 free_blks => l_freelist_blocks
10 );
11 dbms_output.put_line('blocks on freelist=:'||' '||l_freelist_blocks);
12 end;
13 /
blocks on freelist=: 0
PL/SQL 过程已成功完成。
这是freelist上还是0个块,由于删除了偶数行,现在每个索引叶子块都存在”洞“
把删掉的行重新插入
naruto@ORCL>insert into t
2 select * from all_objects
3 where mod(object_id,2) = 1
4 /
已创建24991行。
提交完成。
把object_id大于25000的行删掉
naruto@ORCL>delete from t
2 where object_id > 25000
3 /
已删除25579行。
提交完成。
naruto@ORCL>declare
2 l_freelist_blocks number;
3 begin
4 dbms_space.free_blocks
5 ( segment_owner => user,
6 segment_name => 'P_ID',
7 segment_type => 'INDEX',
8 freelist_group_id => 0,
9 free_blks => l_freelist_blocks
10 );
11 dbms_output.put_line('blocks on freelist=:'||' '||l_freelist_blocks);
12 end;
13 /
blocks on freelist=: 57
PL/SQL 过程已成功完成。
这时看到freelist上有57个块,索引块只有全为空时才会被重用,放到freelist上。就算索引块上有许多无用的index entry,oracle也不会自动整合这些空间,除非手动rebuild或coalesce。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25361369/viewspace-697690/ ,如需转载,请注明出处,否则将追究法律责任。