T-SQL : 'Kayıt varsa güncelle, yoksa ekle' durumu için iki farklı yöntem

by Uğur Çelenk 6. Kasım 2008 01:05

İlk Yöntem

Öncelikle update işlemi gerçekleştirilir, bu işlem sonucunda etkilenen kayıt sayısı kontrol edilir, eğer @@ROWCOUNT = 0 ise güncellenebilecek bir kayıt bulunmuyor demektir, bu durumda kayıt eklenir.

    UPDATE Tablo1 SET Kolon1 =  @Kolon1_Degeri WHERE ID = @ID
    IF @@ROWCOUNT = 0
    BEGIN
       INSERT INTO Tablo1 (Kolon1) VALUES (@Kolon1_Degeri)
    END
 

İkinci Yöntem

Öncelikle kaydın olup olmadığını anlamak için IF EXISTS kullanılarak select cümlesi çalştırılır. Kayıt varsa güncelleme işlemi yapılıyor, yoksa ekleme işlemi yapılıyor. 

    IF EXISTS(SELECT ID FROM Tablo1 WHERE ID = @ID)
    BEGIN
       UPDATE Tablo1 SET Kolon1= @Kolon1_Degeri WHERE ID = @ID
    END
    ELSE
    BEGIN
       INSERT INTO Tablo1 (ID, Kolon1) VALUES (@ID, @Kolon1_Degeri)
    END


Peki hangi yöntem performans açısından daha iyidir?

Kesinlikle X. yöntem kullanılmalıdır gibi birşey söylemek mümkün değil, tamamen kullandığınız yapıyla ilgili sizin karar vermeniz gerekmektedir. Şöyle ki,
- Eğer kayıt  büyük ihtimalle bulunuyorsa yani güncelleme işleminin büyük ihtimalle gerçekleşeceğini düşünüyorsanız 1. yöntemi uygulamak performans açısından daha iyi olacaktır.
- Eğer büyük ihtimalle insert işlemi gerçekleşecek diyorsanız, 1. yönteme göre 2. yöntemi uygulamak daha mantıklı olacaktır. Çünkü INSERT ve UPDATE işlemleri pahalı işlemlerdir.

Tags:

Yorumlar

23.09.2009 23:21:02 #

Murat

Yöntemlerin kullanım şeklini ihtimalden ziyade, sorguyu çalıştıracağımız tablonun datasına göre belirlemek daha mantıklı olduğunu gördüm.

Datası fazla olan tablolarda şiddetle 1. yöntemi öneririm.
Çünkü iyi ihtimalle tek işlem, en kötü ihtimalle 2 işlem yapacaktır.

2. yöntemde ise her zaman bir select ve yanında bir insert ya da update olacaktır.
Bu da her zaman 2 işlem demektir.

Ayrıca 1.yöntemi kullanmanın bir faydasıda var ki belirtmekte fayda var.
Sadece select sorgusunun çalıştırmakla IF EXISTS(SELECT...) yazmak arasında büyük bir performans farkı vardır.
Büyük datalara sahip bir tablo üzerinde deneyebilirsiniz.


Murat | Yanıtla

Yorum ekle




biuquote
  • Yorum
  • Canlı önizleme
Loading



Etiket Bulutu