相同點:
1.不帶where子句的delete、truncate和drop都會删除表内的所有資料。
2.drop、truncate都是DDL語句,執行後會自動送出。
不同點:
1. truncate和delete 隻删除資料,表結構不變;
drop會删除整個表(包括表結構),drop将删除表的結構被依賴的限制(constrain),觸發器(trigger)和索引(index),依賴于該表 的存儲過程/函數将保留,但變為無效狀态。
2. delete 屬于DML,該操作會放到 rollback segment 中,事務送出之後才生效,可復原,若有相應的 trigger,執行的時候将被觸發;
truncate、drop 屬于DDL,操作立即生效,原資料不放到 rollback segment 中,不能復原,操作不觸發 trigger。
3. delete 操作不會減少表或索引所占空間;
truncate 會将該表和索引所占空間恢複到初始大小;
drop 語句将表所占用的空間全部釋放。
4.速度,一般來說: drop> truncate > delete
5.使用範圍:truncate隻能對table,delete可對table和view
6.安全性:小心使用 drop 和 truncate,尤其沒有備份的時候.
使用上,想删除部分資料行用 delete,注意帶上where子句. 復原段要足夠大;
想删除表,當然用 drop;
想保留表而将所有資料删除,若與事務無關,用truncate,若與事務有關,或者想觸發trigger,用delete。
若是整理表内部的碎片,可用truncate跟上reuse stroage,再重新導入/插入資料。
7.對于由foreign key限制引用的表,不能用truncate,而應使用不帶where的delete,由于truncate不記錄在日志中,無法激活觸發器。
8.delete需手動commit送出才會生效,可通過rollback撤銷,且不影響表所占用的extent,高水線(high watermark)保持原位置不變;
truncate會删除表中所有記錄,并且将重新設定高水線和所有的索引,預設情況下将空間釋放到minextents個extent,除非用reuse storage,不 會記錄日志。
“Truncate table 表名” 速度快且效率高的原因:
分析:truncate table 在功能上與不帶where的delete語句相同:二者均删除表中的全部行。
但truncate table比delete速度快,且使用的系統和事務日志資源少。delete語句每次删除一行,并在事務日志中為所删除的每行記錄 一項。truncate table通過釋放存儲表資料所用的資料頁來删除資料,隻在事務日志中記錄頁的釋放。