Truncate table 詳解及與delete,drop 的區別

tolywang發表於2008-09-08


由於經常要用到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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章