【问题标题】:Best way to add column with default value while under load在负载下添加具有默认值的列的最佳方法
【发布时间】:2012-05-17 10:27:07
【问题描述】:

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

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

【问题讨论】:

  • 您的 USER 表中有多少行?
  • 用户表中存在 10,000 行。
  • 你能衡量性能吗?
  • Kiquenet,我不是数据库性能专家,但从以前的经验来看,由于 Oracle 内部缓存等原因,我发现在数据库中测量性能非常困难。
  • 这个问题和NOT NULL有什么关系?即,为什么这与 DEFAULT 优化有关?

标签: oracle alter-table


【解决方案1】:

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

如果版本

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

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

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

【讨论】:

  • docs.oracle.com/cd/B28359_01/server.111/b28310/… 中找到了一些关于该主题的文档:“对于某些类型的表(例如,没有 LOB 列的表),如果您同时指定 NOT NULL 约束和默认值,则数据库可以优化列添加操作,大大减少DML锁表的时间”
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2010-09-08
      相关资源
      最近更新 更多