Oracle

為什麼要截斷 DDL?

  • August 2, 2021

我有一個面試問題,在我面試的時候被問到。我回答了這個問題,但面試官對我的回答並不那麼信服。那麼,有人請用我的理解糾正我嗎?

問:為什麼 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 語句。

引用自:https://dba.stackexchange.com/questions/36607