Если дб имеет простои, самое быстрое решение, вероятно, сделать, как Tom Kyte говорит:
create table new as select ... from old;
drop table old;
rename table new to old;
Если у вас нет окна, где это может произойти (это, вероятно, заказы на величину быстрее) и блокировка таблицы не допускается, тогда я рекомендую вам проверить dbms_parallel_execute. Oracle может разделить таблицу на куски и обновить каждый кусок отдельно. Это намного чище, чем насыпной сбор и обновление FORALL, потому что вы можете просто использовать оператор обновления вы бы иметь, если вы хотите один большое обновления с дополнительным условием and rowid between :start and :stop
begin
dbms_parallel_execute.create_task (task_name => 'MyTask');
dbms_parallel_execute.create_chunks_by_rowid(
task_name => 'MyTask',
table_owner => 'Me',
table_name => 'MyTable',
by_row => true,
chunk_size => 1000);
dbms_parallel_execute.run_task(
task_name => 'MyTask',
sql_stmt => 'UPDATE mytable
set col = newval
where ...
and rowid between :start_id and :end_id',
language_flag => dbms_sql.native,
parallel_level => 8);
тогда, когда это будет сделано проверить состояние:
dbms_parallel_execute.task_status(task_name => 'MyTask') = dbms_parallel_execute.FINISHED
и отбросить задачу, если она преуспела.
dbms_parallel_execute.drop_task(task_name => 'MyTask');
[комментарий Тома Кайта на частые фиксаций] (https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:4951966319022): «* является неправильно, неправильно, так неправильно .... Так очень очень неправильно * "или" * Часто совершать ... делает это для вас: замедляет вас, да, это правильно, МЕДАЕТ ВАС ВНИЗ * " –
Имеет смысл, Теперь у меня есть хорошие аргументы, чтобы придерживаться моего решения. Благодарю. – DoubleT28
У IIRC некоторые огромные обновления имеют проблемы с сегментами отката («ORA-01555: снимок слишком старый»), поэтому рекомендуется иногда обновлять поблочно. –