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
- oracle建立臨時表空間和資料表空間以及刪除Oracle
- Linux檔案刪除但空間不釋放問題篇Linux
- 刪除UNDO表空間並處理ORA-01548問題
- 資料庫:drop、truncate、delete的區別資料庫delete
- Tablespace表空間刪除
- Mysql資料庫delete刪除後資料恢復報告MySql資料庫delete資料恢復
- 處理Linux刪除檔案後空間未釋放的問題Linux
- (轉載)刪除檔案後硬碟空間不釋放的問題硬碟
- Mysql InnoDB刪除資料後釋放磁碟空間的方法MySql
- MySQL防止delete命令刪除資料的兩種方法MySqldelete
- 面試題: 資料庫:delete和trancate刪除表記錄的區別面試題資料庫delete
- oracle級聯刪除使用者,刪除表空間Oracle
- MySQL 5.7的表刪除資料後的磁碟空間釋放MySql
- 刪除臨時表空間組
- 指定刪除幾天前的索引資料索引
- oracle資料庫建立、刪除索引等操作Oracle資料庫索引
- 資料庫關鍵詞 drop、truncate和delete的用法資料庫delete
- mysql刪除主鍵索引,刪除索引語法MySql索引
- Python如何遞迴刪除空資料夾Python遞迴
- Ubuntu 強制刪除資料夾(非空)Ubuntu
- 什麼?還在用delete刪除資料《死磕MySQL系列 九》deleteMySql
- 聊聊PG資料庫的防誤刪除問題資料庫
- 解決刪除檔案後 WSL2 磁碟空間不釋放的問題
- Linux命令curl去操作delete去刪除資源Linuxdelete
- Kafka超過保留期限資料未刪除的問題Kafka
- Linux檔案刪除空間未釋放Linux
- [待整理]oracle10g刪除(釋放)資料檔案/表空間流程Oracle
- 手機資料夾清理技巧!刪除幾個資料夾,瞬間騰出幾G記憶體空間記憶體
- [20180409]delete刪除緩慢分析.txtdelete
- MyBatisPlus解決邏輯刪除與唯一索引的相容問題MyBatis索引
- RM刪除檔案空間釋放詳解
- 刪除資料
- 資料庫索引分裂 問題分析資料庫索引
- whk我【資料刪除】你個【資料刪除】的
- Oracle 刪除使用者、表空間、資料檔案、使用者下的所有表Oracle
- Mac記憶體空間不足怎麼辦?試試刪除這幾個資料夾!Mac記憶體
- 如何刪除 Mac 儲存空間的其他選項?Mac
- DataFrame刪除複合索引索引