Truncate table 詳解及與delete,drop 的區別
由於經常要用到Truncate , delete, drop 等命令,但是可能還有一些同
學不是太了解操作過程中及之後資料庫中資料結構的變化以及可能帶來的後果,
所以在這里編寫了一些相關的資料,寫的比較凌亂,不過重要的知識點基本涉及
到了,希望對各位同學有幫助,有不妥的地方望指正。
語法: TRUNCATE TABLE [schema.] table [{DROP | REUSE} STORAGE]
功能: 刪除整個表的資料並釋放空間
由於Truncate 是DDL 命令,所以執行過程中原資料不放在Rollback
Segment 中,不產生回滾資料 ,不產生Redo Log 。 Truncate , Drop 等DDL
命令都是隱含提交的 。
例子 :
A, B 為兩個Table .
A, B 的資料分別放在 erp_data 表空間下
A, B 的索引分別放在 erp_indx 表空間下
那麼
我們使用下面的兩個語句刪除兩個表中的資料
Truncate table A drop storage ;
Truncate table B reuse storage ;
得到的結果將是(測試可以參考
http://www.itpub.net/showthread.php?threadid=588125&pagenumber= ):
Truncate table A drop storage ;
--data : 資料部分所在的extent 空間會被釋放(釋放回收到 minextents
個extent),騰出來的空間可以供其它segment 使用 。
--index : B 表的index 部分會資料刪除,extent 部分也被釋放,剩下第一個
extent .
--hwm : 會將HWM 重新設定到第一個Block 的位置(hwm 會改變).
Truncate table B reuse storage ;
--data : 資料部分所在的extent 空間不會被回收(僅僅資料會被刪
除),資料刪除之後的freespace 空間只能供本表使用,不可
以供其它 segment 使用 。
--index : B 表的index 部分會資料刪除,但是保留extent 部分
--hwm : 會將HWM 重新設定到第一個Block 的位置(hwm 會改變).
小結:
使用Truncate 將會:
1.清除相應索引(不是Drop,仍然保留extent) ;
2.受外來鍵參考的約束(FOREIGN KEY).當然必須先DISABLE 或DROP 相應的外來鍵參
考,才能TRUNCATE,注意沒有CASCADE 選項 .
3.不觸發DELETE 觸發器
4.若使用了DROP STORAGE(缺省), 除了已指定的MINEXTENTS,其它EXTENT 重新
分配NEXT_EXTENT 設定MINEXTENTS 之後的EXTENT,High-Water Mark 復位指向
表中的第一個BLOCK。 使用REUSE STORAGE 保留表的使用空間 ,保留原來的擴
展,但不合併; HWM(高水位)的位置RESET 到第一個BLOCK。 當使DROP STORAGE
時將縮短表和表索引,將表收縮到最小範圍,並重新設定NEXT 引數。 REUSE
STORAGE 不會縮短表或者調整NEXT 引數。另外一個區別是,用reuse storage
可以減少對錶及資料字典的鎖定時間,特別是大表常這樣做,餘下和DEALLOCATE
UNUSED 來逐步回收空間。
Truncate 語句缺省情況(缺省情況為drop storage)下空間釋放到 minextents
個 extent, 除非使用reuse storage (如果使用reuse storage,那麼這些刪除
之後留下的空間會被保持) ; Truncate 會將高水線復位(回到最開始)。 如果是
整理表內部的碎片,可以用truncate 跟上reuse stroage,再重新匯入/插入數
據。
Delete 語句不影響表所佔用的extent, 高水線(high watermark)保持原位置不
動 。 Delete 語句是DML,這個操作會放到rollback segement 中,事務提交之後
才生效;如果有相應的trigger,執行的時候將被觸發。
Drop 語句將表所佔用的空間全部釋放 。 drop 語句將刪除表的結構被依賴的約
束(constrain),觸發器(trigger),索引(index); 依賴於該表的儲存過程/函式
將保留,但是變為invalid 狀態 。
速度上,一般來說: drop> truncate > delete
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-442302/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Truncate table詳解及與delete,drop的區別delete
- SQL truncate 、delete與drop區別SQLdelete
- truncate delete drop 區別delete
- drop table和truncate table的區別
- 資料庫:drop、truncate、delete的區別資料庫delete
- drop、delete 與truncatedelete
- truncate與delete的區別delete
- oracle truncate 與 delete 的區別Oracledelete
- 詳解SQL中drop、delete和truncate的異同SQLdelete
- truncate和不帶where子句的delete, 以及drop區別delete
- truncate delete 的區別delete
- Truncate,Delete,Drop的比較.delete
- zt_orafaq_delete與truncate的區別delete
- truncate和delete 的區別delete
- truncate,delete,drop的異同點delete
- 簡述truncate、delete和dropdelete
- HWM和delete,drop,truncate的關係delete
- truncate,delete,drop的異同點(原)delete
- 關於delete,drop,truncate的問題delete
- delete table 和 truncate table - 型別安全的心 - 部落格園delete型別
- delete和truncate刪除的區別delete
- Oracle中truncate和delete的區別Oracledelete
- 在MySQL中 Truncate Delect Drop 的區別MySql
- SQLSERVER 的 truncate 和 delete 有區別嗎?SQLServerdelete
- Oracle中truncate和delete的區別(例項)Oracledelete
- [轉][資料庫SQL語句]truncate/delete/drop同與不同資料庫SQLdelete
- oracle恢復表delete/truncate/drop的方法總結Oracledelete
- 表管理之四:刪除資料Delete與truncate的使用區別delete
- 資料庫關鍵詞 drop、truncate和delete的用法資料庫delete
- oracle實驗記錄 (基礎,truncate與delete區別實驗)Oracledelete
- table中cesllspacing與cellpadding的區別詳解padding
- rman 中delete 與delete force 的區別delete
- v$lock之alter table drop column與alter table set unused column區別系列五
- alter database drop datafile 與 drop tablespace file 的區別Database
- RMAN恢復單個表空間或被DROP/DELETE/TRUNCATE的表delete
- equals與==的區別(詳解)
- 詳解not in與not exists的區別與用法
- delete 和 delete [] 的真正區別delete