1

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

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

谢谢,萨万

4

2 回答 2

2

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

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

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

并同样更新第二部分。

于 2020-02-14T06:08:48.093 回答
2

要获得从该行的其他列计算的附加列,您可以使用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
于 2020-02-14T07:36:49.780 回答