30

将列添加到具有默认值且约束不为空的表时。是作为单个语句运行还是在数据库负载时将其分解为多个步骤更好。

ALTER TABLE user ADD country VARCHAR2(4) DEFAULT 'GB' NOT NULL

相对

ALTER TABLE user ADD country VARCHAR2(2)
UPDATE user SET country = 'GB'
COMMIT
ALTER TABLE user MODIFY country DEFAULT 'GB' NOT NULL
4

3 回答 3

21

性能取决于您使用的 Oracle 版本。无论如何都会生成锁。

如果版本 <= Oracle 11.1,则 #1 与 #2 相同。无论如何它很慢。从 Oracle 11.2 开始,Oracle 为第一条语句引入了一个很好的优化(一个命令完成所有工作)。您无需更改命令 - Oracle 只是表现不同。它仅将默认值存储在数据字典中,而不是更新每个物理行。

但我也不得不说,我过去遇到了一些与此功能相关的错误(在 Oracle 11.2.0.1 中)

  • 如果使用直接 = Y 完成导出,则传统导入失败
  • 合并语句会抛出 ORA-600 [13013](oracle 内部错误)
  • 使用此类表的查询中的性能问题

我认为这个问题在当前版本 11.2.0.3 中已经修复,所以我可以推荐使用这个功能。

于 2013-05-15T12:25:06.107 回答
0

前段时间,我们评估了同一问题的可能解决方案。在我们的项目中,我们必须删除表上的所有索引,执行更改并恢复索引。

于 2012-05-17T10:29:57.717 回答
0

如果您的系统需要使用该表,那么 DBMS_Redefinition 确实是您唯一的选择。

于 2012-05-17T10:58:26.650 回答