Создание нового вычисляемого столбца в таблице oracle exadata с 3 миллиардами строк - PullRequest
1 голос
/ 14 февраля 2020

У меня есть таблица в Oracle exadata с 3,4 миллиардами строк. Мне нужно создать новый столбец в этой таблице, который является суммой двух других столбцов в таблице. Я попробовал ниже. - Создайте столбец, используя alter table add column. - Обновить столбец набора таблиц C = Столбец A + столбец B. Но после обновления возникла ошибка, показанная ниже. ORA-30036: невозможно расширить сегмент на 8 в табличном пространстве отмены 'UNDOTBS1'

Я прочитал онлайн-документацию по этой ошибке и проверил ее администратором базы данных, и он сказал, что это не проблема с пространством, и что я должен попробовать альтернативный вариант к заявлению об обновлении в этом случае. Пожалуйста, дайте мне знать, как еще я могу выполнить эту операцию. Могу ли я сделать это с помощью вставки?

Спасибо, Саван

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Чтобы получить дополнительный столбец, который рассчитывается из другого столбца строки, вы можете использовать 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 голосов
/ 14 февраля 2020

Поскольку вы обновляете миллиард строк, именно поэтому он занимает больше места и возвращает ошибку табличного пространства. Одно простое решение состоит в том, что вы можете обновить таблицу из двух частей вместо непосредственного обновления всей таблицы.

Если у вас есть столбец с уникальным порядковым номером, то вы можете сделать следующее

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

И аналогично обновите вторую часть.

...