1
我需要運行以下DDL:DDL語句執行時間取決於記錄數量嗎?
ALTER TABLE storage_archive MODIFY duration char(7);
目前列char(5)
並有近萬億表中的記錄。
如果數據庫中有更多記錄,或者與表中記錄的數量無關,此DDL語句是否需要更多時間?由於我執行DDL而不是DML(更新或刪除),我的理解是它不應該依賴於表中的記錄數。
我在這方面有錯嗎?
我需要運行以下DDL:DDL語句執行時間取決於記錄數量嗎?
ALTER TABLE storage_archive MODIFY duration char(7);
目前列char(5)
並有近萬億表中的記錄。
如果數據庫中有更多記錄,或者與表中記錄的數量無關,此DDL語句是否需要更多時間?由於我執行DDL而不是DML(更新或刪除),我的理解是它不應該依賴於表中的記錄數。
我在這方面有錯嗎?
答案取決於你執行的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
感謝德米特里尼克福洛夫:) – DJJ