2011-11-05 25 views
1

Oracle中的SQL命令TRUNCATE比DELETE FROM table;更快,因爲TRUNATE命令首先完全刪除指定的表,然後創建一個具有相同結構的新表(可能需要澄清,以防萬一我可能是錯誤)。由於TRUNCATE是DDL的一部分,因此它在執行之前和執行完成後隱含地發出COMMIT。如果出現這種情況,那麼由TRUNCATE命令刪除的表將永久丟失,並且它在數據字典中是整個結構。在這種情況下,TRUNCATE命令如何能夠首先丟棄表並重新創建相同的結構?Oracle中的TRUNCATE命令如何在刪除表後檢索表的結構?

回答

5

我以爲truncate(其他的東西)只是重置高水位標記。

看到:http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10007.htm#SQLRF01707

然而在 http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2816964500346433991

很顯然,一個截斷後的數據段的變化。

+0

+1我認爲這位「知名作家」正在彌補! –

+0

數據段確實發生了變化,但僅限於自表創建後修改。新創建的(或截斷的)沒有插入的表(包括立即回滾的表)將不會分配新的數據段。我認爲最好將截斷解釋爲自己分配一個新的數據段。# –

7

(請注意,我在SQL Anywhere的工程爲Sybase工作,我的回答來自於我如何truncate實施有知識,但我想它在甲骨文類似的爲好。)

我不相信桌子實際上被丟棄並重新創建;內容簡單地被扔掉。這比delete from <table>快得多,因爲沒有觸發器需要執行,而不是一次刪除一行(從表和索引),服務器可以簡單地丟棄包含該表的行的所有頁,以及任何索引。

相關問題