将列添加到具有默认值且约束为非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
答案 0 :(得分:18)
性能取决于您使用的Oracle版本。无论如何都会生成锁。
如果版本< = Oracle 11.1则#1与#2相同。反正它很慢。 从Oracle 11.2开始,Oracle为第一个语句引入了一个很好的优化(一个命令完成所有操作)。您无需更改命令 - Oracle只是表现不同。它仅将默认值存储在数据字典中,而不是更新每个物理行。
但我还要说,我在过去遇到了一些与此功能相关的错误(在Oracle 11.2.0.1中)
我认为此问题已在当前版本11.2.0.3中修复,因此我建议您使用此功能。
答案 1 :(得分:0)
前一段时间我们已经评估了同一问题的可能解决方案。在我们的项目中,我们必须删除表上的所有索引,执行更改和恢复索引。
答案 2 :(得分:0)
如果您的系统需要使用该表,那么DBMS_Redefinition是您唯一的选择。