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;
提交完成。