Oracle一括変更データ-Mergeでの小結の使用


最近のニーズでは、2つのテーブルに一致する関連フィールドが発生し、プライマリ・テーブルのフィールド・ビジネスが変更されました.一括変更でOracleのmergeに接触しました
新しい知识に出会って、私はまず少し理解しました
基本概念:
MERGE文はSQL文の一種です.SQL Server、Oracleデータベースでは使用できますが、MySQL、PostgreSQLでは使用できません.MERGEは、UPDATE文とINSERT文を統合するOracle 9 iの新しい構文です.MERGE文では、1枚のテーブル(元データテーブル、source table)またはサブクエリの接続条件に基づいて別のテーブル(ターゲットテーブル、target table)テーブルをクエリーし、接続条件マッチング上のUPDATEを行い、マッチングできないINSERTを実行します.この構文は1回のフルテーブルスキャンですべての作業を完了し,INSERT+UPDATEよりも実行効率が高い.具体的には、MERGE文は、元のデータテーブルレコードとターゲットテーブルレコードをチェックします.元のデータテーブルとターゲットテーブルの両方に記録されている場合、ターゲットテーブルの記録は元のデータテーブルの記録に更新されます(Update操作を実行します).ターゲット・テーブルに存在しないレコードが元のデータ・テーブルに存在する場合、元のデータ・テーブルのレコードがターゲット・テーブルに挿入されます(Insert操作を実行します).Oracle 10 gの前に、merge文は一致更新と不一致挿入の2つの簡単な使い方をサポートし、10 gでOracleはmerge文を強化し、条件オプションWHEREとDELETE操作を追加した.
Merge構文:
MERGE [hint] INTO [schema ] table [t_alias] USING [schema ]{ table | view | subquery } [t_alias] ON ( condition ) WHEN MATCHED THEN merge_update_clause WHEN NOT MATCHED THEN merge_insert_clause;
MERGE INTO second s 
USING (select * from trade) t 
ON (s.settle_serial=t.settle_serial)  
WHEN MATCHED THEN
UPDATE SET
s.remarks = t.serial
WHERE to_char(add_time,'yyyy-MM-dd')=to_char(sysdate,'yyyy-MM-dd')

--   
secondMERGE INTO       ,s    --t    
USING          (Tip:              [trade],      sql[select * from trade])
ON           
WHEN MATCHED THEN      ON             
UPDATE SET     
updateWHERE        (Tip:lz       ,       ,    add_time  )

1万回の修正操作後、ターゲット・テーブルに不一致データを書き込むビジネス・ニーズがある場合は、次のMerge文が使用されます.
WHEN NOT MATCHED THEN INSERT VALUES (s.ID, s.OWNER, s.OBJECT_NAME,s.REMARKS);

--  
WHEN NOT MATCHED THEN       ON                
   s      ,       。

上記のように本人が直接測定して使用し、ロット修正はupdate-selectでロット修正することもできます.
今のmergeはupdateの代わりに完全に使えるはずです...oracle updateの制限のため、関連updateの書き方はupdate set=(....を1回書く)where exists(1編書く)に似ており、テーブルやインデックスへのアクセス光の書き方は2回で、set内のサブクエリはnested loopsに似ています...実行回数が多くなる可能性があります.更新される行数が多いと必ず遅くなります.しかしmergeは上の欠点がなくて、hash joinを歩くことができて、行数を更新して多くて、優勢は出てきました...