关于索引重用空间的总结测试

发表于:2007-8-29 13:20  作者:未知   来源:网络转载

字体: | 上一篇 | 下一篇 |我要投稿 | 推荐标签:

4)测试使用ALTER INDEX COALESCE命令来收缩空间
SQL> alter index T_PK coalesce;

索引已更改。

SQL> exec show_space('T_PK',user,'INDEX');
Free Blocks.............................10
Total Blocks............................24
Total Bytes.............................196608
Unused Blocks...........................2
Unused Bytes............................16384
Last Used Ext FileId....................5
Last Used Ext BlockId...................2
Last Used Block.........................2

PL/SQL 过程已成功完成。

      全部数据使用了22块,删除一半数据后,使用收缩命令释放了10块,差不多是一半,实现了空间的收回。

5)测试使用ALTER INDEX REBUILD命令来重建索引
SQL> exec show_space('T_PK',user,'INDEX');
Free Blocks.............................0
Total Blocks............................12
Total Bytes.............................98304
Unused Blocks...........................0
Unused Bytes............................0
Last Used Ext FileId....................5
Last Used Ext BlockId...................46
Last Used Block.........................4

PL/SQL 过程已成功完成。

      重建索引实现了索引数据的重新分配,这种情况是最理想,所以在对表经常更新,删除后要重建索引。


4。关于索引空间自动回收的例子
      观点:索引空间从来不会自动“重新收回”,讲的是一旦一个索引块使用,就会永远粘在索引结构的那个空间,并且只有插入的数据进入索引的那个位置时,它才会重用。
      结论:另一方面,如果使用1-10000的值装载一张表,然后删除其中值等于或小于5000的行,会发现从索引中清除的块重新放到了索引的FREELIST中,这个空间可以完全重用。

1)创建测试表和测试数据,加入测试数据17920行,然后删除连续的一半数据。
SQL> create table t(x int);

表已创建。

SQL> insert /*+ APPEND*/ into t select rownum from all_objects;

已创建4480行。
SQL> commit;

提交完成。

SQL> insert /*+ APPEND*/ into t
2 select rownum+cnt from t,(select count(*) cnt from t);

已创建4480行。
SQL> commit;

提交完成。
SQL> insert /*+ APPEND*/ into t
2 select rownum+cnt from t,(select count(*) cnt from t);

已创建8960行。
SQL> commit;

提交完成。

SQL> select count(*) from t;

COUNT(*)
----------
17920


2)增加索引
SQL> alter table t add constraint t_pk primary key (x);

表已更改。

3)现在测量大量连续数据删除前后利用的情况:
SQL> exec show_space('T_PK',user,'INDEX');
Free Blocks.............................0
Total Blocks............................40
Total Bytes.............................327680
Unused Blocks...........................1
Unused Bytes............................8192
Last Used Ext FileId....................5
Last Used Ext BlockId...................546
Last Used Block.........................3

PL/SQL 过程已成功完成。

SQL> DELETE FROM T WHERE X<8960;

已删除8959行。

SQL> COMMIT;

提交完成。


43/4<1234>

评 论

论坛新帖

顶部 底部


建议使用IE 6.0以上浏览器,800×600以上分辨率,法律顾问:上海信义律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2021, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪公网安备 31010102002173号

51Testing官方微信

51Testing官方微博

扫一扫 测试知识全知道