2 Nisan 2014 Çarşamba

Yeni Cardinality Estimator

Bildiğiniz gibi dün, 1 Nisan'da SQL Server 2014 artık genel olarak kullanılabilir oldu ve Microsoft'un aşağıdaki adresinden indirilebilir:

http://technet.microsoft.com/en-US/evalcenter/dn205290

Yeni Cardinality Estimator hakkında biraz daha fazla yeni bilgi edinme şansım oldu, sizlerle de paylaşmak istedim.

Öncelikle, Cardinality Estimator nedir biraz onu anlatmaya çalışayım. Cardinality Estimation, SQL Server sorgu işlemcisi tarafından, Execution Plan oluşturulma işleminde kullanılır. Cardinality Estimate'ler nihai kayıt sayısı ve Join'ler, filtrelemeler ve SUM, COUNT gibi Aggregate işlemlerindeki kayıt sayılarının tahmininde kullanılır. Bu tahminler de yapılacak olan işlemler için oluşturulacak Execution Plan'ların seçimini belirler.

SQL Server 2014 öncesindeki SQL Server 2000, 2005, 2008, 2008R2 ve 2012 gibi versiyonlarda çoğu  kodu SQL Server 7.0'da yazılmış Cardinality Estimator kullanılıyordu; SQL Server 2014 ile birlikte isteğe bağlı olarak yeni, çağımızın iş yüklerine uygun olarak yazılmış Cardinality Estimator kullanılacak. İsteğe bağlı olarak dedim, çünkü bu yeni Cardinality Estimator'ı eğer veritabanının Compatibility Level'ını 120 yaparsanız veya 2312 numaralı Trace Flag'i kullanırsanız kullanabiliyorsunuz. Eğer veritabanınızın Compatibility Level'ı 120'den düşük ise ve 2312 numaralı Trace Flag'i de kullanmıyorsanız, o zaman yukarıda sıraladığım eski versiyonlarda varolan Cardinality Estimator'ı kullanıyor olacaksınız.

Eğer veritabanınızın Compability Level'ı 120 ise ve siz buna rağmen yine de eski Cardinality Estimator'ı kullanmak istiyorsanız o zaman da 9481 numaralı Trace Flag'i kullanmanız gerekiyor.

Eğer veritabanınızın Compatibility Level'ı 120 ise Execution Plan'ın 1. operatörünün Properties penceresindeki CardinalityEstimationModelVersion alanında 120 değerini göreceksiniz. Eğer ilgili veritabanının Compatibility Level'ı 120'den daha düşükse, o zaman bu alanda 70 değerini göreceksiniz. Bu da bence SQL Server 7.0'ye vurgu.

Bu Trace Flag'lerini sunucu, oturum veya sorgu düzeyinde kullanabilirsiniz. Ben şahsen, isterseniz ayıplayabilirsiniz, sorgu düzeyinde Trace Flag kullanılabildiğini bilmiyordum. Aşağıda bir örneğini veriyorum:

SELECT * FROM FactCurrencyRate WHERE DateKey = 20101201 OPTION (QUERYTRACEON 2312)

Compatibility Level'larını her değiştirdiğinizde ilgili veritabanı için Plan Cache'inizin de tamamen sıfırlanacağını hatırlamalısınız. Bu nedenle bu işlemi sık sık yapmak istemezsiniz.

Cardinality Estimator'un hangi versiyonunu kullanıyor olursanız kullanın, ama sonuç olarak Cardinality Estimator'lar için İstatistikler çok önemlidir. Bu nedenle İstatistiklerinizi olabildiğince güncel tutmanızda fayda büyük var. Auto Update Statistics ve Auto Create Statistics ayarlarının açık olduğundan emin olmalısınız. Index ve İstatistik bakımlarınızı düzenli olarak yapmalısınız. Cardinality Estimator'lar için bunlar çok kritiktir.


Yeni Cardinality Estimator'da, eskisinde olan tablo değişkenleriyle, TVF, TVP ve yerel değişkenlerle ilgili sorunların düzeltilmediği de belirtiliyor.


Bu yazı için yararlandığım kaynak: CSS SQL Server Engineers: SQL Server 2014’s new cardinality estimator (Part 1) 


Ekrem Önsoy

Hiç yorum yok: