2017-06-22 18 views
1

私は約800万の行を更新し、最良の方法を探しています。 私はすでに一括収集と更新を使用しようとしましたが、時間がかかります。 5000レコードごとにコミットします。 130分間。私はわずか0.25%の準備ができているので、別の方法で探しています。 テーブルの構造は数百万行を更新するときのOracleのパフォーマンス

CAMP_TASK      NUMBER    
CODE_SYSTEM      VARCHAR2(10 CHAR) 
ID_SOURCE      VARCHAR2(40 CHAR) 
ID_SOURCE_PARENT     VARCHAR2(40 CHAR) 
DATE_EFFECTIVE     DATE    
PROC_INSERTED     NUMBER    
PROC_UPDATED      NUMBER    
CAMP_TASK_PARENT     NUMBER 

であると私はid_source_parentがnullでない場合camp_task値でcamp_task_parentフィールドを更新する必要があります。つまり、id_source_parentを持っている場合は、対応するcam_taskを見つけて、現在のローミングのためにcamp_task_parentを更新します。

ありがとうございます!あなたが回復 面積が不足しないように

1)は同じ構造

create table new_table as select * from old_table where 1=2; 

2)そのテーブルのロギングを無効にして、新しい空のテーブルを作成するために、

+0

あなたは本当に1つの大きなトランザクションでそれを行う必要がありますか? – BigMike

+0

よく、私は毎月5000レコードをコミットしてください – MileP

+0

、テーブルの定義を表示し、どの列を更新する必要がありますか、どこに条件がありますか? – Vecchiasignora

答えて

5

最速の方法は次のようになりますスペース

alter table new_table nologging; 

3)更新されたレコード、バイパス制約、 トリガーやバッファキャッシュを持つ新しいテーブルを移入

insert /*+ APPEND */ into new_table (select <update column expressions> from old_table); 

4)ダブルチェックデータは

drop old_table; 
alter table new_table logging; 
rename new_table to old_table; 

6)再作成したインデックス

7)バックアップデータベース

5)クリーンアップ正しく移行されます

+0

そしてリソースがある場合は、 CPUとIOの帯域幅、あなたも並列処理を採用することができます。 – BobC

関連する問題