Обновление 700 миллионов строк до того же значения

12

У меня есть хранилище данных (оракул), где мне нужно установить одинаковое значение столбца для всех 700 миллионов строк.

У меня нет доступа администратора или доступа к администратору, так что это должно быть выполнено с помощью простого SQL, и временная таблица не создается.

Еще больше усложняет вопрос, если я попытаюсь просто выполнить простое обновление, где 1 = 1, у него заканчивается свободное место.

То, как я сейчас его запускаю - это цикл, такой как этот:

loop
  update mytable set mycolumn = '1' where mycolumn is null and rownum < 50000;
  commit;
end loop

но я знаю, что это, вероятно, наивно, и должно быть более быстрое и элегантное решение.

owook
источник
Стол разделен?
Джек говорит, попробуй topanswers.xyz
Я не верю в это. Есть несколько индексов, но ни один из них не включает столбец, который я обновляю.
owook

Ответы:

4

Если у вас есть место, вы можете использовать CTAS, используя минимальное количество отмен / повторов . Если у вас есть какие-либо индексы, то любой другой способ будет очень медленным и будет генерировать журналы как сумасшедшие.

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

--редактировать

Я не могу создать дополнительную таблицу ... Есть несколько индексов, но ни один из них не включает столбец, который я обновляю.

Затем я предлагаю разбить таблицу на куски для обработки с использованием чего-то, что вы индексируете (даже если это один столбец, вы можете разбить его на диапазоны значений). Это будет выполнять FTS один раз, а не один раз для каждого блока, как в вашем код. Вам придется смириться с огромным количеством повторов и стереть место отмены (так что в дальнейшем нет воспоминаний)

--edit2

если вы можете добавить / переименовать / удалить столбцы, вы можете сделать это очень эффективно , но только на 11g

Джек говорит, попробуйте topanswers.xyz
источник
1
Если ваш администратор NOLOGGINGбазы данных позволяет вам это сделать , это лишит законной силы hotstandbys.
Гай
Действительно, и резервное копирование впоследствии было бы хорошей идеей - но это склад и nologgingинструмент для складов,
говорит Джек, попробуйте topanswers.xyz
Я не могу создать дополнительную таблицу, конечно, не такую ​​большую, как первая, хотя бы и временную.
сегодня,
Ваша ссылка 11g выглядела многообещающе, но я вижу там комментарии, что для таблицы 60 м она все еще ужасно медленная из-за необходимости устанавливать значение для каждой строки. Поскольку мой размер таблицы в 10 раз больше, этот метод не может быть улучшением.
сегодня
@owook no, в 11g эта операция выполняется быстро и не устанавливает значение для каждой строки «для некоторых типов таблиц (например, для таблиц без столбцов больших объектов . Попробуйте это на подмножестве вашей таблицы ( create table foo as select * from bar where rownum<100000)
Джек говорит, попробуйте topanswers.xyz
1

Если вы используете 11g, отбросьте столбец и добавьте его обратно как столбец NOT NULL со значением по умолчанию. Это нелогично, но Oracle будет хранить значение по умолчанию в определении таблицы, подставляя значение по умолчанию во время выполнения.

Адам Муш
источник