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)
在默認是 Drop STORAGE 當使用Drop STORAGE時將縮短表和表索引,將表收縮到最小範圍,並重新設置NEXT參數。REUSE STORAGE不會縮短表或者調整NEXT參數ITPUB個人空間;
在特殊情況下使用 REUSE STORAGE
一個實際應用的典型例子:你用sqlldr加載一個1000萬記錄的數據表,但是加載了多一半的時候你發現有問題,這個時候你想清空表重新加載。那麼最好 reuse storage ,這樣再次加載就不需要再次尋找空閒空間了。
1 一個只有一列的最簡單的表
SQL> desc t;
名稱 是否爲空? 類型
----------------------------------------- -------- ----------------------------
A VARCHAR2(200)
2 清理以前的數據
SQL> truncate table t;
表被截斷。
3 打開時間顯示
SQL> set timing on;
4 查看當前情況
SQL> select count(*) from t;
COUNT(*)
----------
0
已用時間: 00: 00: 00.00
5 向裏面插入100萬數據
SQL> begin
2 for i in 1 .. 1000000
3 loop
4 insert into t values(i);
5 end loop;
6 end;
7 /
PL/SQL 過程已成功完成。
已用時間: 00: 00: 34.42
6 檢查數據情況,注意使用的時間在0.03秒左右
SQL> select count(*) from t;
COUNT(*)
----------
1000000
已用時間: 00: 00: 00.03
SQL> select count(*) from t;
COUNT(*)
----------
1000000
已用時間: 00: 00: 00.03
7 提交
SQL> commit;
提交完成。
已用時間: 00: 00: 00.00
8 再次測試,在0.02秒左右
SQL> select count(*) from t;
COUNT(*)
----------
1000000
已用時間: 00: 00: 00.03
9 刪除所有的數據
SQL> delete from t;
已刪除1000000行。
已用時間: 00: 00: 23.71
10 再次測試,大約在0.01秒左右
SQL> select count(*) from t;
COUNT(*)
----------
0
已用時間: 00: 00: 00.01
SQL> select count(*) from t;
COUNT(*)
----------
0
11 截斷表
SQL> truncate table t;
表被截斷。
已用時間: 00: 00: 00.29
12 再次查詢,用時爲0
SQL> select count(*) from t;
COUNT(*)
----------
0
已用時間: 00: 00: 00.00
SQL> select count(*) from t;
COUNT(*)
----------
0
已用時間: 00: 00: 00.00
SQL>
13 結論
數據被刪除後,高水平線(high-water mark,HWM)並沒有復位只是那些空間不再使用而已,再次查詢依然會讀取HWH以前的塊查找是否有可用的數據。而截斷表將復位HWH,告訴這些空間沒有保存數據。
所以,如果允許截斷表(注意:會產生事務提交),則truncate操作比delete操作的結果更好。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/java2000_net/archive/2009/01/07/3728313.aspx