Web design, Web development, Web hosting & Network administration

SQL: If Exists Update Else Insert

Αυτό είναι ένα πολύ συνηθισμένο σενάριο όταν έχουμε να κάνουμε με διαχείριση δεδομένων. Καλούμε μια stored procedure και θέλουμε να κάνουμε Update εάν τα δεδομένα υπάρχουν ήδη ή Insert εάν δεν υπάρχουν. Το Books Online documentation μας δίνει το ακόλουθο παράδειγμα για την επίτευξη του παραπάνω στόχου:

IF EXISTS (SELECT * FROM Table1 WHERE Column1='Value1')
    UPDATE Table1 SET (...) WHERE Column1='Value1'
ELSE
    INSERT INTO Table1 VALUES (...)

Ο τρόπος αυτός φυσικά και δουλεύει παρόλαυτα δεν είναι η καλύτερη λύση στο πρόβλημά μας. Και αυτό συμβαίνει γιατί ο Sql server θα κάνει table/index scan και για το SELECT και για το UPDATE. Ο παρακάτω τρόπος, αντίθετα με το παράδειγμα πιο πάνω, αποφεύγει τα δύο scan και καταφέρνει να κάνει μόνο ένα:

UPDATE Table1 SET (...) WHERE Column1='Value1'
IF @@ROWCOUNT=0
    INSERT INTO Table1 VALUES (...)


Αν ο πίνακάς μας έχει αρκετό αριθμό εγγραφών, το scan που αφαιρέσαμε μπορεί να ανεβάσει την απόδοση σε σημαντικό βαθμό.

Τα παραδείγματα του MSDN μπορεί να είναι πολύ απλά στην εφαρμογή τους, αυτό όμως δεν σημαίνει πως είναι πάντα και τα πιο σωστά από άποψη απόδοσης. Όπως πάντα όμως καλό είναι να δοκιμάζουμε και να μετράμε την απόδοση του τρόπου που επιλέγουμε πριν να τον εφαρμόσουμε σε production σενάριο. Πολλές φορές ο τρόπος που πιστεύουμε ότι είναι ο χειρότερος αποδεικνύεται τελικά ο καλύτερος.
Tags: sql, performance, stored procedures