Oracle中的Truncate和Delete語句(與索引的關係)

轉載自:http://www.cnblogs.com/hqbhonker/p/3312028.html
首先講一下,truncate命令:  

 

語法:TRUNCATE  TABLE  table;

 

表格裏的數據被清空,存儲空間被釋放。

 

運行後會自動提交,包括之前其它未提交的會話,因而一旦清空無法回退。

 

只有表格的創建者或者其他擁有刪除任意表格權限的用戶(如DBA)才能清空表格。

 

TRUNCATE  TABLE  dept30;

 

Table truncated.

 

------------------------------------------------------------------------------------------------------------

 

下面講一下truncate命令和delete的區別:

 

1、TRUNCATE在各種表上無論是大的還是小的都非常快。如果有ROLLBACK命令DELETE將被撤銷,而TRUNCATE則不會被撤銷。

 

2、TRUNCATE是一個DDL語言,向其他所有的DDL語言一樣,他將被隱式提交,不能對TRUNCATE使用ROLLBACK命令。 

 

3、TRUNCATE將重新設置高水平線和所有的索引。在對整個表和索引進行完全瀏覽時,經過TRUNCATE操作後的表比DELETE操作後的表要快得多。 

 

4、TRUNCATE不能觸發任何DELETE觸發器。 

 

5、不能授予任何人清空他人的表的權限。 

 

6、當表被清空後表和表的索引講重新設置成初始大小,而delete則不能。 

 

7、不能清空父表。 TRUNCATE TABLE (schema)table_name DROP(REUSE) STORAGE 在默認是 DROP STORAGE 當使用DROP STORAGE時將縮短表和表索引,將表收縮到最小範圍,並重新設置NEXT參數。REUSE STORAGE不會縮短表或者調整NEXT參數在特殊情況下使用 REUSE ST

 

 

 

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

 

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

 

 

 

===========================================================

 

 

 

TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。

 

DELETE 語句每次刪除一行,並在事務日誌中爲所刪除的每行記錄一項。TRUNCATE TABLE 通過釋放存儲表數據所用的數據頁來刪除數據,並且只在事務日誌中記錄頁的釋放。

 

TRUNCATE TABLE 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置爲該列的種子。

 

如果想保留標識計數值,請改用 DELETE。

 

如果要刪除表定義及其數據,請使用 DROP TABLE 語句。

 

 

 

--------------------------------------------------------------------------------------

 

以上只是介紹一下兩個命令的用法,下面說一下我的推薦用法,truncate命令速度快,佔用資源少,如果你能確定當前表裏的數據完全沒有用的話可以使用此命令,方面快捷,如果數據或許有用,那你最好做好備份,否則一旦使用此命令,就悔不當初了,當然delete命令還是有好處的,如果不能保證此後的數據有不有用,但是當前不知道,或者乾脆就是誤刪了,那麼使用rollback命令直接回滾,當然rollback命令可以添加回滾點,定位回滾,恢復數據比較方便,所以說對與初學者,樓主強烈建議大家刪除數據時使用delete命令,麻煩事麻煩了點,但是保險一點,這是我的教訓啊,誤用truncate命令清空了一個表,還好這個表是無關緊要的,否則我就只有以謝天下了。當然,非常強烈的建議是,做任何操作前,對於有用的數據都要事先備份,不管用不用得着,有備無患。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章