2010-04-23 63 views
1

我知道刪除刪除數據以及表結構,而截斷保留表結構。刪除/截斷和回滾段

是否刪除/截斷寫入回滾段?

+0

你的問題都標記'oracle'和'mysql'。如果你想讓你的問題得到解答,我想你應該在你的問題中說清楚。 – 2010-04-23 20:50:02

+0

只爲oracle會做 – user319280 2010-04-23 20:56:39

回答

1

在Oracle中,答案爲否,因爲回滾段僅用於DML。

TRUNCATE是DDL。

+0

好吧。 還有1個問題。我知道刪除是DML,截斷是DDL。 給出了名爲員工的表格, 1.刪除與員工之間的區別是什麼? 和 2.截斷員工; 什麼時候使用每個? – user319280 2010-04-23 23:00:58

+0

截斷速度更快,部分原因是它不會生成回退。這導致了至少兩個重要的區別:顯然它不能被回滾,並且獨立於提交而立即生效。假設你想清空並重新填充表格。如果您刪除,插入,提交,那麼就其他用戶而言,表永遠不會爲空,並且如果您回滾舊數據,則會恢復。如果您截斷,插入,提交,則所有其他會話都會在截斷和提交之間看到一個空表,這可能會導致問題,並且如果插入失敗並回滾,它將保持爲空。 – 2010-04-23 23:53:09

+0

答案很有道理! – user319280 2010-04-24 07:37:08

2

每個DDL語句都是離散事務。這是因爲數據庫需要管理其元數據(Oracle中的數據字典)。基本上它必須始終進行糾正和驗證,因此元數據的更改無法回滾。因此,在每個DDL語句之前和之後都會發布隱含的commit。這適用於大多數,可能是所有的RDBMS產品。

TRUNCATE TABLE和DROP TABLE都是DDL語句都是DDL,所以沒有回滾。如果我們擁有針對Oracle最新版本的Enterprise Edition許可證,我們可以使用FLASHBACK TABLE將表格恢復到以前的狀態,包括BEFORE DROP。

編輯

這裏是DELETE和TRUNCATE TABLE之間的差異。這個例子日期是這個大表:

SQL> exec dbms_stats.gather_table_stats(user,'BIG_TABLE') 

PL/SQL procedure successfully completed. 

SQL> select blocks, num_rows 
    2 from user_tables 
    3 where table_name = 'BIG_TABLE' 
    4/

    BLOCKS NUM_ROWS 
---------- ---------- 
    15449 2340320 

SQL> 

刪除第一....

SQL> delete from big_table 
    2/

2340320 rows deleted. 

Elapsed: 00:01:20.37 
SQL> 
SQL> exec dbms_stats.gather_table_stats(user,'BIG_TABLE') 

PL/SQL procedure successfully completed. 

Elapsed: 00:00:10.20 
SQL> 
SQL> select blocks, num_rows 
    2 from user_tables 
    3 where table_name = 'BIG_TABLE' 
    4/

    BLOCKS NUM_ROWS 
---------- ---------- 
    15449   0 

Elapsed: 00:00:00.11 
SQL> 

而且現在的截斷......

SQL> truncate table big_table reuse storage 
    2/

Table truncated. 

Elapsed: 00:00:08.31 
SQL> exec dbms_stats.gather_table_stats(user,'BIG_TABLE') 

PL/SQL procedure successfully completed. 

Elapsed: 00:00:00.26 
SQL> 
SQL> select blocks, num_rows 
    2 from user_tables 
    3 where table_name = 'BIG_TABLE' 
    4/

    BLOCKS NUM_ROWS 
---------- ---------- 
     0   0 

Elapsed: 00:00:00.00 
SQL> 

之間的差異是顯而易見的。 TRUNCATE要快得多。它也已經將表格中的塊數歸零。請注意,截斷後即使收集統計信息也會更快。這是因爲TRUNCATE語句重置高水位標記(即零塊),所以作業知道所有分配的塊都未使用。

0

刪除並截斷寫入回滾段。
由於Oracle在自動啓動和提交的單獨事務中執行每個DDL語句,因此您無法自行回滾。

它的工作原理是這樣的:

begin 
    COMMIT; -- any outstanding work 
    begin 
     DDL statement; 
     COMMIT; -- the DDL statement 
    exception 
     when others then 
      ROLLBACK; -- any work done by the DDL 
      RAISE;  -- reraise the exception back to the client 
    end; 
end; 

在DDL語句甲骨文的中間系統崩潰的情況下,將能夠回滾中斷操作。信息來源:article on Ask Tom