【问题标题】:Creating a new calculated column in a oracle exadata table with 3 billion rows在具有 30 亿行的 oracle exadata 表中创建新的计算列
【发布时间】:2020-02-14 04:37:17
【问题描述】:

我在 Oracle exadata 中有一个包含 34 亿行的表。 我需要在此表中创建一个新列,它是表中其他 2 列的总和。 我尝试了以下。 - 使用alter table add column 创建列。 - 更新表集 C 列 = A 列 + B 列。 但是更新在一段时间后抛出了以下错误。 ORA-30036: 无法在撤消表空间“UNDOTBS1”中将段扩展 8

我阅读了有关此错误的在线文档并与 DBA 进行了核对,他说这不是空间问题,在这种情况下我应该尝试替代更新语句。 请让我知道我可以通过哪些其他方式执行此操作。我可以使用插入来做到这一点吗?

谢谢, 萨万

【问题讨论】:

  • 一个更正:我想它应该是 A 列 + B 列,而不是你提到的两列总和的 =。
  • 是的。我编辑了它。谢谢。

标签: sql oracle exadata


【解决方案1】:

要获得从该行的其他列计算的附加列,您可以使用virtual column

最大的好处是你不存储数据,它不能不一致,它是立即安装的。

alter table TEST add
(columnC NUMBER GENERATED ALWAYS AS (columnA + columnB) VIRTUAL)
;

select * from TEST;

   COLUMNA    COLUMNB    COLUMNC
---------- ---------- ----------
         1          1          2
         2          2          4
         3          3          6

【讨论】:

    【解决方案2】:

    当您更新十亿行时,这就是它消耗更多空间并返回表空间错误的原因。一种简单的解决方案是您可以分两部分更新表格,而不是直接更新整个表格。

    如果您有具有唯一序列号的列,那么您可以执行以下操作

    update test set columnC=columnA+columnB where id between 1 and 1000000;
    

    同样更新第二部分。

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 1970-01-01
      • 2013-08-10
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 2014-09-01
      • 1970-01-01
      相关资源
      最近更新 更多