delete/truncate刪除資料索引空間問題
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索引是一個好習慣,一是提高索引效率二是釋放存貯區
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18921899/viewspace-1017049/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 臨時表空間資料刪除問題
- delete和truncate刪除的區別delete
- 表管理之四:刪除資料Delete與truncate的使用區別delete
- 刪除資料庫表空間資料庫
- mysql資料庫中刪除資料的三種形式 drop和 truncate 和 deleteMySql資料庫delete
- 關於delete,drop,truncate的問題delete
- 為什麼當刪除整個表中的資料時,需使用TRUNCATE代替DELETEdelete
- oracle建立臨時表空間和資料表空間以及刪除Oracle
- 空間索引 - 各資料庫空間索引使用報告索引資料庫
- Oracle delete資料後的釋放表空間問題的解決 --轉Oracledelete
- Mysql 刪除資料後為釋放物理空間MySql
- oracle誤刪除表空間的資料檔案Oracle
- Delete大量資料後,回收表空間delete
- truncate table 誤刪除資料後的恢復
- Linux下資料檔案刪除檔案系統空間不釋放的問題Linux
- 刪除空資料檔案
- Linux檔案刪除但空間不釋放問題篇Linux
- 刪除正在使用的檔案,空間不釋放的問題
- 如何正確的刪除表空間資料檔案
- oracle刪除(釋放)資料檔案/表空間流程Oracle
- oracle 失誤刪掉資料檔案後,刪除表空間操作Oracle
- 資料庫:drop、truncate、delete的區別資料庫delete
- 刪除表空間,資料檔案也刪除後,但作業系統層面上空閒空間不見增加。作業系統
- RMAN恢復單個表空間或被DROP/DELETE/TRUNCATE的表delete
- 批量刪除空的資料夾
- (轉載)刪除檔案後硬碟空間不釋放的問題硬碟
- 刪除UNDO表空間並處理ORA-01548問題
- Mysql InnoDB刪除資料後釋放磁碟空間的方法MySql
- 【Oracle-資料庫維護】-刪除臨時表空間Oracle資料庫
- oracle 小議如何從表空間 刪除 資料檔案Oracle
- Oracle 刪除資料後釋放資料檔案所佔磁碟空間Oracle
- Mysql資料庫delete刪除後資料恢復報告MySql資料庫delete資料恢復
- 面試題: 資料庫:delete和trancate刪除表記錄的區別面試題資料庫delete
- 大資料表的truncate,列刪除,shrink回收高水位大資料
- 解決linux下刪除檔案或oracle表空間後空間不釋放的問題LinuxOracle
- Sqlserver delete表部分資料釋放資料檔案空間SQLServerdelete
- 處理Linux刪除檔案後空間未釋放的問題Linux
- 解決linux刪除檔案後空間沒有釋放問題Linux