2012-09-05 10 views
10

より高速です。Oracle Mergeと選択してから挿入または更新します

MERGE文

MERGE INTO table_name 
    USING dual 
    ON (row_id = 'some_id') 
    WHEN MATCHED THEN 
    UPDATE SET col_name = 'some_val' 
    WHEN NOT MATCHED THEN 
    INSERT (row_id, col_name) 
    VALUES ('some_id', 'some_val') 

または

更新または挿入ステートメントを使用して、その後select文を問い合わせます。

SELECT * FROM table_name where row_id = 'some_id' 

他の行数== 0

INSERT INTO table_name (row_id,col_name) VALUES ('some_id','some_val') 

UPDATE table_name SET col_name='some_val' WHERE row_id='some_id' 

答えて

22

あなたは1つのSQLでそれを行うことができれば、親指のルールは、ある場合、それは一般的にパフォーマンスが向上します複数のSQL文でそれを行うよりも。

私はそれが仕事をするならば、私はマージに行くだろう。また

- 別の提案:あなたの文でデータの繰り返しを避けることができ、例えば:

MERGE INTO table 
USING (SELECT 'some_id' AS newid, 
       'some_val' AS newval 
     FROM dual) 
ON (rowid = newid) 
WHEN MATCHED THEN 
UPDATE SET colname = newval 
WHEN NOT MATCHED THEN 
INSERT (rowid, colname) 
VALUES (newid, newval) 
+0

私は同じ考え方でしたが、Oracleサーバーのプロセスはどうでしたか? – DRTauli

+1

プロセスはどうですか? –

+0

rowidは単に行pkです。 – DRTauli

-3

マージの世話をします。あなたの地域の多くを消費することができますTEMPHASH JOINを使用しています。ヒントFIRST_ROWSを使用して彼をテストするか、またはUPDATEビュー結合を使用してINSERTNOT EXISTSを使用してください。

関連する問題