Perşembe , 26 Nisan 2018

SQL Serverda Bilinçsiz Tür Dönüşümü İş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′

SELECT p.FirstName ,

p.LastName ,

c.AccountNumber

FROM Sales.Customer AS c

INNER JOIN Person.Person AS p ON c.PersonID = p.BusinessEntityID

WHERE AccountNumber =@AccountNumber

Yukarıdaki sorgumuzda AccountNumber kolonumuzun 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.

sql server

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.

sql server 2

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′

SELECT p.FirstName ,

p.LastName ,

c.AccountNumber

FROM Sales.Customer AS c

INNER JOIN Person.Person AS p ON c.PersonID = p.BusinessEntityID

WHERE AccountNumber =@AccountNumber

sql server 1

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.

Hakkında ismailadar

Cevapla

E-posta adresiniz yayınlanmayacak. Required fields are marked *

*


*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>