Oracle
為什麼要截斷 DDL?
我有一個面試問題,在我面試的時候被問到。我回答了這個問題,但面試官對我的回答並不那麼信服。那麼,有人請用我的理解糾正我嗎?
問:為什麼 Truncate 是 DDL 而 Delete 是 DML ?兩者都做幾乎相同的工作(刪除行)
答。當我們使用 Truncate 時,我們正在取消分配由數據分配的整個空間,而不是保存到 undo-table-space。但是,在刪除的情況下,我們將所有數據放入撤消表空間,然後我們將刪除所有數據。
請,如果有人知道上述的最佳答案,請解釋。
DML 與 DDL 的區別並不像它們的名字所暗示的那樣清楚,所以有時事情會變得有點混亂。
Oracle在概念指南中明確將其歸類
TRUNCATE
為 DDLDELETE
,但歸類為 DML。
TRUNCATE
據我了解,Oracle 的 DDL 陣營的主要觀點是:
TRUNCATE
可以更改儲存參數(NEXT
參數),這些是對象定義的一部分——在 DDL 陣營中。TRUNCATE
做一個隱含的commit
,並且不能回滾(除了閃回) - Oracle 中的大多數(全部?)DDL 操作都這樣做,沒有 DML 這樣做。
TRUNCATE
不執行觸發器這一事實ON DELETE
也將其與正常的 DML 操作區分開來(但一些直接路徑 DML 操作也會跳過觸發器,因此這不是一個明確的指標)。相同的文件說明會
DELETE
生成 UNDO,但TRUNCATE
不會,因此您的陳述在這方面是正確的。(請注意,TRUNCATE
確實會生成一些REDO
,以便在恢復/恢復的情況下可以重播截斷。)但是某些NOLOGGING
操作也可以減少 UNDO(完全不確定是否沒有),所以在我看來,這也不是一個明確的指標。所以我總結為:
truncate
不是“事務性的”,因為它送出並且不能回滾,並且可以修改對象儲存屬性。所以它不是普通的 DML——Oracle 將其歸類為 DDL。delete
是一個普通的 DML 語句。