2012-09-05 9 views
10

Was ist schneller?Oracle Merge vs Wählen Sie dann Einfügen oder Aktualisieren

die Merge-Anweisung

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') 

oder

eine select-Anweisung Abfrage dann ein Update mit oder Anweisung einzufügen.

SELECT * FROM table_name where row_id = 'some_id' 

wenn rowCount == 0

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

sonst

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

Antwort

22

Die Faustregel ist, wenn Sie es in einer SQL tun kann, wird es in der Regel eine bessere Leistung als es in mehreren SQL-Anweisungen zu tun.

Ich würde mit dem MERGE gehen, wenn es den Job macht.

auch - ein weiterer Vorschlag: Sie vermeiden können Daten in Ihrer Erklärung, z.B .:

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

Ich dachte das gleiche, aber wie wäre es mit dem Prozess auf dem Oracle-Server? – DRTauli

+1

Was ist mit dem Prozess? –

+0

Rowid ist nur die Zeilen pk. – DRTauli

-3

Achten Sie auf die Zusammenführung zu wiederholen. Es kann viel von Ihrem Bereich TEMP mit HASH JOIN verbrauchen. Testen Sie ihn mit Hinweis FIRST_ROWS oder verwenden Sie UPDATE Ansicht verbinden plus INSERT mit NOT EXISTS.