Bu makalede MSSQL Server Execution Plan Compute Scalar Operatörünün ne işe yaradığını detaylı bir şekilde görmüş olacağız Bir sorgu çalıştırdığınızda SQL Server sadece verileri okumakla kalmaz; bazen bu verileri dönüştürmesi, birleştirmesi veya üzerlerinde matematiksel işlemler yapması gerekir. İşte bu noktada devreye Compute Scalar operatörü girer. Genelde maliyeti çok etkilemeyen ifadeler olarak karşımıza çıkmaktadır. Maliyeti düşük olduğu için genelde göz ardı edilen bir yapı olarak karşımıza çıkmaktadır.

Compute Scalar operatörün üzerine tıklayıp Tooltip penceresini inceleyelim.

Output listesinde gösterilen Expr1002 adıyla temsil edilen kolon Compute Scalar işlemi sonucunda hesaplanan yeni kolon için verilen temsili isimdir. Bu kolonun oluşturulması için kullanılan formülü ise operatörün özellikleri penceresinden aşağıdaki gibi görebiliriz.
Şu durumlarda bu operatörü görmeniz kaçınılmazdır:
- Matematiksel İşlemler: SELECT BirimFiyat * Adet gibi çarpma, bölme işlemleri.
- Veri Tipi Dönüşümleri (Conversion): CAST veya CONVERT kullanımı ya da SQL Server’ın arka planda yaptığı implicit (örtük) dönüşümler.
- String Birleştirmeler: Ad + ‘ ‘ + Soyad gibi işlemler.
- Fonksiyonlar: GETDATE(), LEN(), LEFT() gibi skaler fonksiyonların kullanımı.
- CASE WHEN İfadeleri: Koşullu mantık yürütme süreçleri.
Compute Scalar ifadesinin üzerine sağ tıklayıp properties ekranında ouput list bölümündeki değerleri görebiliriz.

Yukarıdaki resimde de gördüğümüz gibi Tooltip penceresinde gösterilen Expr1002 adındaki kolon için kullanılan formülü detaylı bir şekilde görebiliriz.
İlgili bölüme tıkladıktan sonra ne tür işlem yapıldığı görülebilir.

Avantajları:
- Genellikle execution planlarda maliyeti %0 olarak görünür. Çünkü CPU üzerinde çok hızlı gerçekleşen bir işlemdir.
- Veriyi uygulama katmanına ham halde göndermek yerine, veritabanı seviyesinde anlamlı hale getirmeyi sağlar.
Dezavantajları:
- Eğer milyonlarca satır üzerinde karmaşık bir CASE WHEN veya tip dönüşümü yapıyorsanız, o “%0” maliyet bir anda CPU darboğazına dönüşebilir.
- Bazen Compute Scalar, verinin filtrelenmesinden (Seek/Scan) önce gerçekleşirse, indeks kullanımını engelleyebilir (özellikle WHERE bloğundaki dönüşümlerde).
Compute Scalar görülürse ne yapılması gerekmektedir.
Bu operatörü gördüğünüzde panik yapmanıza gerek yoktur, ancak şu iki duruma dikkat etmelisiniz:
Eğer Compute Scalar operatörünün Properties’ında bir CONVERT_IMPLICIT görüyorsanız, bu bir alarm zilidir. Sorgu parametresi ile kolon veri tipinin uyuşmamasıdır. Çözüm olarak veri tiplerini eşitleyin. Bu sayede SQL Server her satırda dönüşüm yapmak zorunda kalmaz ve indeksi daha verimli kullanır.
Compute Scalar operatörüne giriş yapan satır sayısı (Actual Number of Rows) milyonlar mertebesindeyse: Bu hesaplamayı veritabanı yerine uygulamanın (C#, Java vb.) kod tarafında yapmayı değerlendirin. Veritabanı “veriyi getirmek” için, uygulama ise “veriyi işlemek” için optimize edilmiştir.
Aynı hesaplama sürekli yapılıyorsa, bunu tabloya bir Computed Column olarak ekleyip üzerine bir indeks tanımlamak (Persisted), Compute Scalar yükünü tamamen ortadan kaldırır.
Eğer planınızda Compute Scalar varsa ve sorgu yavaşsa; operatörün üzerine gelip “Actual Number of Rows” değerine bakın. Eğer bu sayı çok yüksekse veya operatör bir Index Scan ile yan yanaysa, orada bir optimizasyon fırsatı var demektir.
Bu makalede Compute Scalar Operatörünü detaylı bir şekilde görmüş olduk. Başka bir makalede görüşmek dileğiyle.
Ey iman edenler, sabırla ve namazla yardım dileyin. Gerçekten Allah, sabredenlerle beraberdir. Bakara Suresi, 153. Ayet
