Bilinçsiz Tür Dönüşümü(Implicit Conversion) İşleminin Performansa Etkisi
Benzer olmayan veri tipine sahip verileri karşılaştırmak için SQL Server’ın öncelikle verileri ortak bir türe dönüştürmesi gerekir. Tip dönüşümü iki şekilde yapılabilir. İlk olarak Cast, Convert ve Parse gibi fonksiyonları kullanarak yapılan bilinçli tür dönüşümleri(Explicit Conversion) iken diğer türü ise biz açıkca belirtmememize rağmen SQL Server’ın veriler üzerinde yaptığı bilinçsiz tür dönüşümü (Implicit Conversion) işlemidir. Her iki tür dönüşümü de özellikle index tanımlanmış bir kolon üzerinde yapılan bu tür dönüşümleri sorgu performansını düşürebilmektedir.
SQL Server sorgumuzda kullandığımız WHERE ve ON gibi koşul içeren operatörlerde farklı tipte verileri karşılaştırdığımızda karşılaştırılan verilerin aynı türde olması için bizim fonksiyon kullanrak açıkca belirttiğimiz dönüşümler(Bilinçli tür dönüşümleri) sorguya gözle bile bakılarak performans değerleirnin düşebileceği fark edilebilirken bilinçsiz tür dönüşümü işlemini SQL server query processor tarafında otomatik olarak yapılır ve bu dönüşümden oluşan performans kayıtlarının fark edilmesi daha zor olacaktır. Bu nedenle daha sorgunun yazım aşamasındayken bu tğr otomatik yapılacak olan dönüşümlerden olabildiğince kaçınmalıyız.
Bilinçsiz tür dönüşümleri sonucunda ortaya çıkan performans problemlerine genelde otomatik yapılan VARCHAR(Non-Unicode string) ve NVARCHAR(Unicode string) veri tipleri arasında dönüşümler neden olmaktır. Şimdi örnek veritabanımız AdventureWorks üzerinde bilinçsiz dönüşüm işlemini bir örnek üzerinde gösterelim.
DECLARE@AccountNumber nvarchar(50)='AW00029594'
SELECTp.FirstName ,p.LastName,c.AccountNumber
FROMSales.Customer AS c
INNERJOIN Person.Person AS p ON c.PersonID = p.BusinessEntityID
WHEREAccountNumber =@AccountNumber
Yukarıdaki sorgumuzda AccountNumberkolonumuzun tipi VARCHAR olmasına rağmen karşılaştırma işleminde NVARCHAR tipinde bir veri kullandık. Şimdi bu şekilde sorgumuzun çalışması ile oluşan Execution Planı inceleyelim.

Yukarıdaki gibi Execution Planı incelediğimizde En sağda Index Scan işlemini görebiliyoruz. İlgili filtre işlemimiz için tabloda index olmasına rağmen index seek yerine index scan işlemi SQL Server Query Optimizer tarafından seçilmiştir. Bunun sebebini anlamak içinse yukarıdaki Execution Planımızda yer alan Filter operatörünü yakından inceleyelelim.

Yukarıdaki resimde gördüğümüz gibi Filter operatöründe Implicit Conversion yani bilinçsiz tür dönüşümü yapılmıştır. Şimdi sorgumuzu bilinçsiz tür dönüşümünü engelleyecek şekilde değiştirelim. Bunun için Where ifadesinde yani filtrelemede kullanacağımız veriyi NVARCHAR değil VARCHAR tanımlayalım ve Execution Planı inceleyelim.
DECLARE@AccountNumber varchar(50)='AW00029594'
SELECTp.FirstName ,p.LastName,c.AccountNumber
FROMSales.Customer AS c
INNERJOIN Person.Person AS p ON c.PersonID = p.BusinessEntityID
WHEREAccountNumber =@AccountNumber

Yukarıdaki sorgumuzun Execution Planına baktığımızda SQL Server Query Optimizer’ın Index Scan yerine Index Seek işlemini tercih ettiğiniz görebiliyoruz.