あなたのDBは、ダウンタイムを持っている場合は、最速のソリューションはTom Kyteが言うように行うには、おそらくです:
create table new as select ... from old;
drop table old;
rename table new to old;
あなたはこの現象が発生することができ、ウィンドウを持っていない場合(それはおそらく注文です)テーブルをブロックすることができない場合は、dbms_parallel_executeをチェックアウトすることをお勧めします。 Oracleは表をチャンクに分割し、各チャンクを個別に更新できます。あなたが状態を確認行っていたら、あなただけの、あなたはその後、追加条件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);
と一つの大きな更新を望んでいた場合だろうupdateステートメントを使用することができますので、それはバルクの収集とFORALL更新するよりもずっときれいだ:
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:スナップショットが古すぎます」)に関する問題があります。そのため、ブロック単位で更新することをお勧めします。 –