2014-02-15 53 views
1

我需要運行以下DDL:DDL語句執行時間取決於記錄數量嗎?

ALTER TABLE storage_archive MODIFY duration char(7); 

目前列char(5)並有近萬億表中的記錄。

如果數據庫中有更多記錄,或者與表中記錄的數量無關,此DDL語句是否需要更多時間?由於我執行DDL而不是DML(更新或刪除),我的理解是它不應該依賴於表中的記錄數。

我在這方面有錯嗎?

回答

4

答案取決於你執行的ALTER是什麼種類的。如果您的ALTER僅更改Oracle元數據(例如,您向表中添加可爲空的列或在novalidate模式下添加約束或將列設置爲未使用),則不依賴於用戶數據卷。如果您移動表格或刪除列或縮小表格(執行需要請求或操作數據的事情),則取決於用戶數據量。您需要諮詢Oracle文檔並瞭解Oracle在特定情況下的具體情況。

您的特殊情況會觸碰塊中的數據,因爲Oracle需要爲現有數據添加2個尾隨空格,並且執行時間可能很長。這是使用varchar2代替char的許多原因之一:

SQL> create table t (x char(10)); 

Time spent: 00:00:00.04 
SQL> insert /*+ append */ into t select 'x' from dual connect by level <= 1000000; 

Time spent: 00:00:01.17 
SQL> commit; 

Time spent: 00:00:00.04 
SQL> alter table t modify (x char(20)); 

Time spent: 00:00:52.85 
SQL> drop table t; 

Time spent: 00:00:02.54 
SQL> create table t (x varchar2(10)); 

Time spent: 00:00:00.07 
SQL> insert /*+ append */ into t select 'x' from dual connect by level <= 1000000; 

Time spent: 00:00:01.27 
SQL> commit; 

Time spent: 00:00:00.05 
SQL> alter table t modify (x varchar2(20)); 

Time spent: 00:00:00.07 
+0

感謝德米特里尼克福洛夫:) – DJJ