У меня есть хранилище данных (оракул), где мне нужно установить одинаковое значение столбца для всех 700 миллионов строк.
У меня нет доступа администратора или доступа к администратору, так что это должно быть выполнено с помощью простого SQL, и временная таблица не создается.
Еще больше усложняет вопрос, если я попытаюсь просто выполнить простое обновление, где 1 = 1, у него заканчивается свободное место.
То, как я сейчас его запускаю - это цикл, такой как этот:
loop
update mytable set mycolumn = '1' where mycolumn is null and rownum < 50000;
commit;
end loop
но я знаю, что это, вероятно, наивно, и должно быть более быстрое и элегантное решение.
oracle
performance
owook
источник
источник
Ответы:
Если у вас есть место, вы можете использовать CTAS, используя минимальное количество отмен / повторов . Если у вас есть какие-либо индексы, то любой другой способ будет очень медленным и будет генерировать журналы как сумасшедшие.
В случае, если у вас есть один IOT без каких-либо вторичных индексов или один кластер таблиц, вы можете пошагово выполнить обновление первичного / кластерного ключа порциями без необходимости повторного сканирования всей таблицы, чтобы найти поля, которые еще не были обновлены.
--редактировать
Затем я предлагаю разбить таблицу на куски для обработки с использованием чего-то, что вы индексируете (даже если это один столбец, вы можете разбить его на диапазоны значений). Это будет выполнять FTS один раз, а не один раз для каждого блока, как в вашем код. Вам придется смириться с огромным количеством повторов и стереть место отмены (так что в дальнейшем нет воспоминаний)
--edit2
если вы можете добавить / переименовать / удалить столбцы, вы можете сделать это очень эффективно , но только на 11g
источник
NOLOGGING
базы данных позволяет вам это сделать , это лишит законной силы hotstandbys.nologging
инструмент для складов,create table foo as select * from bar where rownum<100000
)Если вы используете 11g, отбросьте столбец и добавьте его обратно как столбец NOT NULL со значением по умолчанию. Это нелогично, но Oracle будет хранить значение по умолчанию в определении таблицы, подставляя значение по умолчанию во время выполнения.
источник