İleri Seviye SQL: CTE ile MERGE İfadesini Kullanmak
# SQL’de CTE ile MERGE İfadesini Kullanmak
Junction Tablelar için yaptığımız işlemlerde INSERT, UPDATE ve DELETE ifadelerini ayrı olarak yazmamak için genellikle MERGE ifadesini kullanırız. Ancak MERGE ifadesini sade bir şekilde kullandığımızda, Estimate Execution Plan üzerinde birtakım farklılıklar çıkabiliyor (tüm tablo üzerinde işlem yapması gibi). Hem bu durumdan kurtulmak hem de MERGE ifademizin daha okunabilir hale gelmesi için CTE’den yardım alabiliriz.
Peki, nedir bu CTE? : İleri Seviye SQL : CTE (Common Table Expressions)
# Yeni Bir Veritabanı ve Tablo Yapısının Oluşturulması
Kodları uyguladıktan sonra:
- CTE_Merge isminde veritabanını,
- dbo.Categories, dbo.Products ve dbo.ProductCategoryAssignment tablolarını,
- dbo.Categories tablosuna 10, dbo.Products tablosuna 1000 ve dbo.ProductCategoryAssignment tablosuna 500 kayıt oluşacak.
# Yapılacak İşlemin Senaryosu
Gelen parametre değerlerine göre; ürün ID’si 1 olan kayda, 1, 3 ve 8 ID’li kategorilerin tanımlanması işlemi.
# Geleneksel Yöntemle MERGE İfadesi Kullanımı
Geleneksel(standart kullanım) yöntem ile MERGE ifadesi kullanarak senaryoya bağlı olarak istenilen işlemi gerçekleştirecek olursak;
MERGE ifadesinin sonuçlarına da bakacak olursak;
Sonuç ile birlikte elde ettiğimiz bilgiye göre; 1 ve 3 ID’li kategorilerin ataması daha önceden yapıldığından hiçbir işlem yapılmadı. 8 ID’li kategori için başarılı bir şekilde tanımlama yapıldı. 4, 7 ve 10 ID’li kategoriler daha önceden tanımlanmış olduğu için eski tanımlamaları pasife alındı.
Aslında göründüğü gibi gayet senaryomuza uygun bir sonuç elde ettik.
Tanımlama verileri rastgele oluştuğundan çıktı sizlerde farklılık gösterebilir.
Bir de Estimate Execution Plan’ı inceleyelim;
EstimateRows çıktısına baktığımızda 500 satırlık tablomuzun neredeyse tamamına erişerek işlemleri gerçekleştireceğini görüyoruz.
Peki, CTE yardımıyla bu durumdan nasıl kurtuluruz?
# CTE ile MERGE İfadesi Kullanımı
Bu sefer ise CTE ile birlikte MERGE ifadesini kullanarak senaryoya bağlı istenilen işlemi gerçekleştirecek olursak;
CTE kullanarak öncelikle MERGE ifadesi içerisindeki, MATCHED BY SOURCE kısmında yer alan pca.ProductID = @vProductID ve NOT MATCHED BY TARGET kısmında yer alan @vProductID ifadelerinden kurtulmuş olduk. Bu tür fazlalıklardan kurtulmak, MERGE ifadesinin tamamen sade bir hal almasını ve kod okunabilirliğini sağlar.
Sonuçlara bakacak olursak;
Sonuç ile birlikte elde ettiğimiz bilgiye göre; 8 ID’li kategorinin ataması daha önceden yapıldığından hiçbir işlem yapılmadı. 1 ve 3 ID’li kategoriler için başarılı bir şekilde tanımlama yapıldı. 4 ve 6 ID’li kategoriler daha önceden tanımlanmış olduğu için eski tanımlamaları pasife alabildik.
Yine senaryomuza uygun bir sonuç elde ettik.
Tanımlama verileri rastgele oluştuğundan çıktı sizlerde farklılık gösterebilir.
Tekrardan Estimate Execution Plan’ı inceleyelim.
EstimateRows çıktısına baktığımızda 500 satırlık tablomuz için sadece işlem yapmak istediğimiz satırlara erişerek işlem yapacağını görüyoruz.
# Kazanımlar
- CTE’nin tek bir DML ifadesi süresince var olduğunu ve genellikle recursive işlemlerde kullanıldığını,
- View, temp table ve table-value constructora benzediğini ve alanların deklare edilmemesi gerektiğini,
- Birden fazla CTE ifadesi kullanılabildiğini,
- Recursive işlemlerde satır limitinin olduğunu,
- CTE’nin MERGE ifadelerinde, kod yapısını daha düzenli, sade ve sürdürülebilir bir hale gele getirmemize yardımcı olduğunu öğrenmiş olduk.
# Sosyal Medya Hesaplarım
- LinkedIn: Karcan Ozbal | LinkedIn
- Github: karcan (Karcan Ozbal) (github.com)
- Patreon: Karcan is creating little extensions for make your life funny :)
Konu istekleri ve makale ile ilgili tartışmak için yoruma bekliyorum.