据我所知,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.*”的兼容参数。
增加兼容参数后,它按预期工作: