2017-02-07 5 views
0

У меня есть ситуация, когда нужно обновить столбец (все строки) в таблице, содержащей 150 миллионов записей.Массовое обновление в Oracle12c

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

+0

Покажите нам обновление, которое вы хотите запустить. –

+0

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

+0

для существующего столбца я должен маскировать символы, такие как substr (column_name, 1,5) || 'XXXX' @ APC – siva

ответ

1

Самый чистый подход - это не обновление таблицы, а создание новой таблицы с новым столбцом обновленных строк. Например, предположим, что мне нужно, чтобы обновить столбец old_value с макс некоторого значения, вместо обновления old_table один делает:

create new_table as select foo, bar, max(old_value) from old_table; 
drop table old_table; 
rename new_table as old_table. 

Если вам нужно еще больше скорости, вы можете сделать это создание с использованием параллельного запрос с помощью nologging, тем самым генерируя очень мало повтора и никаких журналов отмены. Более подробную информацию можно уточнить здесь: https://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:6407993912330

+0

Я знаю эту технику, но пространство не доступно для хранения новой таблицы. @ Gregory – siva

+1

@siva, если у вас так мало места, тогда вы можете закончить пробел для отмены. Место для хранения дешево, поэтому я бы рекомендовал вам переоценить предложение Грегори. – BobC

+0

Если ваша таблица разделена на разделы, возможно, вы можете воссоздать раздел таблицы за раз. – BobC

Смежные вопросы