Oracle

Oracle 11g 快速添加列耗時 11 小時

  • May 15, 2018

據我所知,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

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