2017-04-04 16 views
0

以下の更新ステートメントには、テーブルとDECODEステートメントへの参照が含まれています。私のテーブルには約500000のレコードがあり、これはこのステートメントによって変更され、2時間30分かかります。どのようなタイプの提案も、これのパフォーマンスを向上させることを歓迎しています。DECODEによる更新ステートメントのパフォーマンスチューニング

はここでデコード文のオプションの数があまり大きくない場合には、私の更新ステートメント

UPDATE TABlE_1 t1 
    SET t1.column_1= DECODE((SELECT creator 
          FROM table_2 t2 
          WHERE t2.key1 = t1.key1 
          AND t2.key2 = t1.key2), 
          'AAAAAAA_table2', 
          'aaaaa_table1', 
          'BBBBBBB_table2', 
          'bbbbb_table1', 
          'ccccc_table1') 
    WHERE t1.column_1 IS NULL; 
+1

なぜパフォーマンスが重要ですか?これは1回限りの更新のように見えますか、500,000のすべてのレコードを頻繁に更新する予定ですか? – mathguy

+0

これは顧客データベースをアップグレードするために使用された更新スクリプトの一部であり、アップグレードプロセスはすばやく行う必要があります。はい、これは1回のアップグレードです – Dimuthu

答えて

0

来て、あなたは、ターゲットの更新ステートメントの数を実行したほうが良いかもしれません。

UPDATE table_1 t1 
    SET t1.column_1 = 'aaaaa_table_1' 
    WHERE EXISTS (SELECT 1 
       FROM table_2 t2 
       WHERE t2.key1 = t1.key1 
       AND t2.key2 = t1.key2 
       AND creator = 'AAAAAA') 
    AND t1.column_1 IS NULL 

次に、実行しようとしているマッピングごとにこれを繰り返します。

+0

Oracleは 'update'文で' from'節を許可しません。 – Allan

+0

ここでは、Oracleの結合を使用して更新するための正しい構文の簡単な説明を示します。 http://stackoverflow.com/documentation/oracle/8061/update-with-joins#t=201704042229465657268 – mathguy

+0

@Tom Kimberの提案は、構文が正しくないのに私にとって役に立ちました。 DECODEステートメントには5つのオプションしかありませんでしたが、5つのステートメントに分割してテーブルを5回訪れてみました。実行時間は1時間短縮されました。 – Dimuthu

0

TABLE_1に挿入するときにCREATOR値を変換するルールがあるようです。 ルールを適用するだけです。

UPDATE table_1 t1 
    SET t1.column_1 = (SELECT LOWER(SUBSTR(creator,1,5))||'_table1' 
         FROM table_2 t2 
         WHERE t2.key1 = t1.key1 
         AND t2.key2 = t1.key2) 
    WHERE t1.column_1 IS NULL 

またはSOのいずれかが迅速になると言うことはできません、私はデータセットでこれらを実行していないMERGE文

MERGE INTO table_1 t1 
USING (SELECT LOWER(SUBSTR(creator,1,5))||'_table1' AS derived_creator 
     FROM table_2) t2 
     ON ( t2.key1 = t1.key1 
      AND t2.key2 = t1.key2) 
WHEN MATCHED THEN UPDATE SET t1.column_1 = t2.derived_creator 

を使用しています。しかし、私は彼らはどちらもきれいに見えると思います。 以下のSQLを与えるDECODE関数ではなく、CASE式をSQLで使用することをお勧めします。

UPDATE TABlE_1 t1 
    SET t1.column_1= SELECT CASE creator 
          WHEN 'AAAAAAA_table2' THEN 'aaaaa_table1' 
          WHEN 'BBBBBBB_table2' THEN 'bbbbb_table1' 
          ELSE 'ccccc_table1' 
          END       
         FROM table_2 t2 
        WHERE t2.key1 = t1.key1 
         AND t2.key2 = t1.key2 
    WHERE t1.column_1 IS NULL 
+0

「ルール」のようには見えません。 'creator'が' 'abc''ならば、更新に使われる値は' 'ccccc_table1''でなければなりません。また、 'CASE'は(" condition "ではなく)' CASE expression'です。 – mathguy

+0

@mathguy - OPの例では、最初の部分が小文字で短縮され、 'ccccc'を使用してフォールスルー変換される2つの '変換'が表示されます。私は 'abc'の言及を見ない。それは私のルールのように見えます。 – BriteSponge

+0

"fall through"は、特に含まれている以外の値(AAAAAA_table2およびBBBBBB_table2)に適用されます。 abcのような他の値は、DECODE関数の結果としてccccc_table2に置き換えられます。 – mathguy

関連する問題