Oracle一括変更データ-Mergeでの小結の使用
3445 ワード
最近のニーズでは、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;
1万回の修正操作後、ターゲット・テーブルに不一致データを書き込むビジネス・ニーズがある場合は、次のMerge文が使用されます.
上記のように本人が直接測定して使用し、ロット修正はupdate-selectでロット修正することもできます.
今のmergeはupdateの代わりに完全に使えるはずです...oracle updateの制限のため、関連updateの書き方はupdate set=(....を1回書く)where exists(1編書く)に似ており、テーブルやインデックスへのアクセス光の書き方は2回で、set内のサブクエリはnested loopsに似ています...実行回数が多くなる可能性があります.更新される行数が多いと必ず遅くなります.しかしmergeは上の欠点がなくて、hash joinを歩くことができて、行数を更新して多くて、優勢は出てきました...
新しい知识に出会って、私はまず少し理解しました
基本概念:
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')
--
second , MERGE INTO ,s --t
USING (Tip: [trade], sql[select * from trade])
ON
WHEN MATCHED THEN ON
UPDATE SET
update ,
WHERE (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を歩くことができて、行数を更新して多くて、優勢は出てきました...