ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 什么情况下索引会重用空间

什么情况下索引会重用空间

原创 Linux操作系统 作者:tyoodz 时间:2011-06-11 21:39:49 0 删除 编辑

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>commit;

提交完成。

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行。

naruto@ORCL>commit;

提交完成。


把object_id大于25000的行删掉
naruto@ORCL>delete from t
  2  where object_id > 25000
  3  /

已删除25579行。

naruto@ORCL>commit;

提交完成。


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博客 ” ,链接:http://blog.itpub.net/25361369/viewspace-697690/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-05-16

  • 博文量
    55
  • 访问量
    75465