truncate與delete的區別

yuan22003發表於2011-08-24

1、在功能上,truncate是清空一個表的內容,它相當於delete from table_name。
2、delete是dml操作,truncate是ddl操作;因此,用delete刪除整個表的資料時,會產生大量的roolback,佔用很多的rollback segments, 而truncate不會。
3、在記憶體中,用delete刪除資料,表空間中其被刪除資料的表佔用的空間還在,便於以後的使用,另外它是“假相”的刪除,相當於windows中用delete刪除資料是把資料放到回收站中,還可以恢復,當然如果這個時候重新啟動系統(OS或者RDBMS),它也就不能恢復了!
而用truncate清除資料,記憶體中表空間中其被刪除資料的表佔用的空間會被立即釋放,相當於windows中用shift+delete刪除資料,不能夠恢復!
4、truncate 調整high water mark 而delete不;truncate之後,TABLE的HWM退回到 INITIAL和NEXT的位置(預設)delete 則不可以。
5、truncate 只能對TABLE,delete 可以是table,view,synonym。
6、TRUNCATE TABLE 的物件必須是本模式下的,或者有drop any table的許可權 而 DELETE 則是物件必須是本模式下的,或被授予 DELETE ON SCHEMA.TABLE 或DELETE ANY TABLE的許可權。
7、在外層中,truncate或者delete後,其佔用的空間都將釋放。
8、truncate和delete只刪除資料,而drop則刪除整個表(結構和資料)。

TRUNCATE   TABLE   在功能上與不帶   WHERE   子句的   DELETE   語句相同:二者均刪除表中的全部行。但   TRUNCATE   TABLE   比   DELETE   速度快,且使用的系統和事務日誌資源少。   
DELETE   語句每次刪除一行,並在事務日誌中為所刪除的每行記錄一項。TRUNCATE   TABLE   通過釋放儲存表資料所用的資料頁來刪除資料,並且只在事務日誌中記錄頁的釋放。 
TRUNCATE   TABLE   刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。如果想保留標識計數值,請改用   DELETE。如果要刪除表定義及其資料,請使用   DROP   TABLE   語句。 
對於由   FOREIGN   KEY   約束引用的表,不能使用   TRUNCATE   TABLE,而應使用不帶   WHERE   子句的   DELETE   語句。由於   TRUNCATE   TABLE   不記錄在日誌中,所以它不能啟用觸發器。   
TRUNCATE   TABLE   不能用於參與了索引檢視的表。 

相關文章