2012-09-05 106 views
10

什麼是更快?Oracle合併與選擇,然後插入或更新

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語句然後使用UPDATE或INSERT語句。

SELECT * FROM table_name where row_id = 'some_id' 

如果rowCount時== 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

拇指的規則是,如果你可以在一個SQL做到這一點,它通常會表現得更好而不是在多個SQL語句中執行。

如果能完成這項工作,我會選擇MERGE。

而且 - 另一種意見認爲:你能避免在聲明中重複的數據,例如:

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

採取合併的照顧。它可以使用HASH JOIN消耗大量的區域TEMP。使用提示FIRST_ROWS或使用UPDATE查看加入以及INSERTNOT EXISTS來測試他。