delete/truncate刪除資料索引空間問題

jss001發表於2009-03-12

drop table dt_test_tab; create table dt_test_tab (i number);
create index dt_test_idx on dt_test_tab(i);
insert into dt_test_tab values (1);
insert into dt_test_tab select i from dt_test_tab;

/ ... / 共17次得到131072條記錄,然後

commit;
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX';

結果為4352k

truncate table dengtaotest;
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX';

結果為128k(就是建表建索引時預設的initial extent,看來是縮回去了)

alter index dt_test_idx rebuild;
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX';

結果還是128K. 想縮到0, 沒門兒 __________________________________________________ 再試試表,索引,

delete/truncate reuse|drop storage

的結果:

select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_TAB';

表大小為:3328K (比索引還小,特例,因為表只一個欄位)

select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX';

索引大小為:4352K 刪掉一半資料:

delete dt_test_tab where rownum < 65536; select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_TAB';

表大小未變:3328K 注意此時還沒有commit;

select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX';

索引大小未變:4352K commit;

select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_TAB';

刪掉一半記錄後表大小未變:3328K

select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX';

刪掉一半記錄後索引大小未變:4352K [刪了記錄,index 也未釋放]

alter index dt_test_idx rebuild; select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX';

刪掉一半記錄後重建索引,索引大小為:2200K [重建索引後,有所釋放]

truncate table dt_test_tab reuse storage;
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_TAB';

重用存貯區的截表,表大小不變:3328K

select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX';

重用存貯區的截表,索引大小同樣未變:2200K

truncate table dt_test_tab;
select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_TAB';

SUM(BYTES)/1024 --------------- 128

select sum(bytes)/1024 from user_extents where segment_name='DT_TEST_IDX';

SUM(BYTES)/1024 --------------- 128 不重用存貯區的截表,結果變了,縮回到了initial extents

[結論]

1、delete,表佔用空間不變,這個眾所周知,所謂的water-mark不變;表上索引佔用空間也不會變;
2、truncate table tb_name reuse storage,表佔用不變,表上索引佔用也不會變;
3、truncate table tb_name,表與表上索引的空間佔用均回到建立索引或表時的initial引數。
4、定期rebuild索引是一個好習慣,一是提高索引效率二是釋放存貯區

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18921899/viewspace-1017049/,如需轉載,請註明出處,否則將追究法律責任。

相關文章