drop、delete 與truncate

ljm0211發表於2012-06-20

要刪除一個表,你可以使用SQL語句DROP TABLE。例如,又從資料庫中徹底刪除表mytable,你要使用如下的語句:

           DROP TABLE mytable

truncate操作 同沒有where條件的delete操作十分相似,只是把表裡的資訊全部刪除,單是表依然存在。

1、無論truncate大表還是小錶速度都非常快。delete要產生回滾資訊來滿足回滾需求,而truncate是不產生的。

2、truncate是DDL語句進行隱式提交,不能進行回滾操作。

3、truncate重新設定表和索引的HWM(高水標記),由於全表掃描和索引快速掃描都要讀取所有的資料塊知道HWM為止。所以全表掃描的效能不會因為delete而提高,但是經過truncate操作後速度會很快。

4、truncate不觸發任何delete觸發器。

5、不能賦給某個使用者truncate其它使用者表的許可權。如果需要trucate其它使用者表的許可權必須對該使用者賦DROP ANY TABLE許可權。

6、當表被truncate後,這個表和索引所佔用的空間會恢復到初始大小,而delete操作不會減少表或索引所佔用的空間。

7、不能truncate一個帶有外來鍵的表,如果要刪除首先要取消外來鍵,然後再刪除。

TRUNCATE TABLE (schema)table_name DROP(REUSE) STORAGE

在預設是 DROP STORAGE 當使用DROP STORAGE時將縮短表和表索引,將表收縮到最小範圍,並重新設定NEXT引數。REUSE STORAGE不會縮短表或者調整NEXT引數在特殊情況下使用 REUSE STORAGE

    一個實際應用的典型例子:
你用sqlldr載入一個1000萬記錄的資料表,但是載入了多一半的時候你發現有問題,
這個時候你想清空表重新載入。
那麼最好 reuse storage ,這樣再次載入就不需要再次尋找空閒空間了

    DELETE語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的的刪除操作作為事務記錄在日誌中儲存以便進行進行回滾操作。

    TRUNCATE TABLE 則一次性地從表中刪除所有的資料頁並不把單獨的刪除操作記錄記入日誌儲存,刪除行是不能恢復的。並且在刪除的過程中不會啟用與表有關的刪除觸發器。執行速度快。

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

相關文章