Oracle
Oracle 11g 快速添加列耗時 11 小時
據我所知,Oracle 11g 的一個新特性是能夠非常快速地添加具有預設值的非空列,因為它不再使用新列中的預設值自動更新表中的每一行。但是,對於剛剛從 10.2.0.5 升級的 11.2.0.4 數據庫上具有約 12 億行的表,以下命令需要約 11 小時:
alter table table_name add column_name varchar2(6) default "DEFLT' not null;
儘管我在文件中看到了以下內容:
“但是,優化的行為受到以下限制: • 表不能有任何 LOB 列。它不能是索引組織的、臨時的或集群的一部分。它也不能是隊列表、對象表或物化視圖的容器表。 • 添加的列不能加密,不能是對象列、嵌套表列或LOB列。
據我所知,我的桌子不符合任何這些條件。Describe 顯示沒有 LOB,ORGANIZATION INDEX 不在 create 語句中,它不是臨時表,也不是集群、隊列、對像或容器表。該列當然是一個 varchar 列。是否有我遺漏的東西,或者答案只是我誤認為我的桌子滿足這些要求之一?
ETA:不確定這是否有幫助,但我在一篇論文中註意到快速列添加的標誌是在過濾謂詞中使用 NVL。從測試表上的解釋計劃來看,我的數據庫似乎沒有執行快速添加:
SQL_ID f78gwf6cz50uq, child number 0 ------------------------------------- select count(1) from t where z = 123456 Plan hash value: 1842905362 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 133 (100)| | | 1 | SORT AGGREGATE | | 1 | 13 | | | |* 2 | TABLE ACCESS FULL| T | 110K| 1406K| 133 (4)| 00:00:02 | --------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("Z"=123456) Note ----- - dynamic sampling used for this statement (level=2)
好的,我為了一個好的理由犧牲了我的 10.2 沙箱數據庫之一,並將其升級到 11.2。
正如我所懷疑的,上述 DDL 優化不適用於仍設置為“10.2.*”的兼容參數。
增加兼容參數後,它按預期工作:
SQL> show parameter compa NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ cell_offload_compaction string ADAPTIVE compatible string 10.2.0.5.0 plsql_v2_compatibility boolean FALSE SQL> alter table t1 add C_DDL number default 42 not null; Table altered. Elapsed: 00:00:52.85 SQL> alter system set compatible='11.2.0.0.0' scope=spfile; System altered. Elapsed: 00:00:00.00 SQL> shu immediate startup Database closed. Database dismounted. ORACLE instance shut down. SQL> ORACLE instance started. Total System Global Area 1068937216 bytes Fixed Size 2260088 bytes Variable Size 289407880 bytes Database Buffers 771751936 bytes Redo Buffers 5517312 bytes Database mounted. Database opened. SQL> alter table t1 add D_DDL number default 42 not null; Table altered. Elapsed: 00:00:00.04