在负载下添加具有默认值的列的最佳方法

时间:2012-05-17 10:27:07

标签: oracle alter-table

将列添加到具有默认值且约束为非null的表时。在数据库处于负载状态时,最好是作为单个语句运行还是将其分解为步骤

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

VERSUS

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

3 个答案:

答案 0 :(得分:18)

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

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

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

    如果使用direct = Y 进行导出,
  • 传统导入失败
  • merge语句可以抛出ORA-600 [13013](内部oracle错误)
  • 使用此类表格的查询中的性能问题

我认为此问题已在当前版本11.2.0.3中修复,因此我建议您使用此功能。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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