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

tolywang發表於2006-07-10

語法: TRUNCATE TABLE [schema.] table [{DROP | REUSE} STORAGE]
功能: 刪除整個表的資料並釋放空間


由於Truncate 是DDL命令,所以執行過程中原資料不放在Rollback Segment中,不產生回滾資料 ,不產生Redo Log 。 Truncate , Drop等DDL命令都是隱含提交的 。

使用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引數。

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狀態 。

Truncate :

drop storage是預設值,其與reuse storage的區別是是否回收清除表中rows的free space給tablespace,如果使用了drop storage,回收回來的frespace可以供其它segment使用,否則這部分空間只能表自己用。

另外一個區別是,用reuse storage可以減少對錶及資料字典的鎖定時間,特別是大表常這樣做,餘下和DEALLOCATE UNUSED 來逐步回收空間。

而對於hwm不論是用drop storage還是reuse storage都會回縮到第一個block。

速度上,一般來說: drop> truncate > delete .

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

相關文章