SQL Server’da Query Optimizer, bir sorgunun nasıl çalıştırılacağıyla ilgili alternatifleri inceleyip karar veren bir yapıdır. Bu kararı verirken veri dağılım şeklinin çok önemli olduğu durumlar da olur. Mesela bir koşul acaba 100 bin satırdan 3′ünü mü döndürüyor yoksa 30 bini mi, bunu bilmesi gerekir ki indeks kullanıp kullanmamaya karar versin.
İstatistikler sayesinde, sorgu planı (Query Plan) oluşturulurken sorgudaki where bloğunda kullanılan kolon için dönecek tahmini kayıt sayısı bulunur. Bulunan bu değer index’e erişim şeklini belirler. Temel amaç, datayı en hızlı ve en az maliyetli şekilde kullanıcının karşısına getirmektir.
İstatistikler Management Studio’da index listesinin hemen altında bulunurlar.
TSQL ile de istatistiklerin sorgulanması mümkündür. Bunun için sys.stats Catalog View’i kullanılabilir.
SELECT * FROM sys.stats WHERE object_id = OBJECT_ID('Sales.Customer')
AdventureWorks2012 DB’si üzerinde Sales.Customer Tablosuna ait Stats bulmamızı sağlıyor. Örnek Resim aşağıdadır.
sys.stats, istatistiklerin isim, otomatik oluşturulup oluşturulmadığı gibi genel bilgilerini vermektedir. İstatistiğin hangi kolonlar üzerine oluşturulduğuna bakmak için sys.stats_columns Catalog View’i kullanılabilir.
Tablo üzerinde bulunan istatistiklere ve bu istatistiklerin hangi kolonlar üzerine oluşturulduğuna sp_helpstats sistem SP’si ile daha kolayca bakılabilir. sp_helpstats ile Sales.Customer tablosunda bulunan istatistikleri aşağıdaki şekilde sorgulayabiliriz.
exec sp_helpstats 'Sales.Customer','ALL'
Tablo üzerinde bulunan istatistiklerin tümünün bir diğer sorgulanma şekli de sp_statistics sistem SP’sinin kullanılmasıdır. Bu SP, sp_helpstats’a oranla daha fazla detay bilgi getirmektedir.,
Tablo üzerine index oluşturulduğu zaman index’te kullanılan ilk kolon için istatistik otomatik olarak oluşturulur. Diğer kolonlar için ise, eğer bu kolonlar sorgunun where bloğunda kullanılırsa ve Auto_Create_Statistics veritabanı özelliği aktif ise otomatik olarak istatistik oluşturulacaktır. Sonraki yazılarda bu konuya tekrar değineceğim.
İstatistik otomatik olarak oluşturulabileceği gibi CREATE STATISTICS komutu ile elle oluşturulabilir. Örneğin Person.Address tablosunda bulunan PostalCode kolonu için istatistik oluşturmak için aşağıdaki komutu kullanabiliriz.
CREATE STATISTICS St_PostalCode ON AdventureWorks2012.Person.Address (PostalCode)
İstatistik oluşturulma ya da güncellenme aşamasında, tablonun boyutu 8 MB’dan büyük ise tablodan rasgele kayıtlar seçilerek örnekleme yapılır. Aksi durumda yani tablo 8 MB’dan küçük ise örneklem olarak tablonun tamamı kullanılır yani istatistik kolonu için bütün tablo okunur. Bu durum “FullScan” olarak ifade edilmektedir.
Tablonun 8 MB’dan büyük olduğu durumlarda gene de FullScan yapılması isteniyorsa, istatistik oluşturma komutu “FULLSCAN” anahtarı ile çalıştırılır. Yukarıdaki şekilde tablo bazıdna istatistik oluşturulabileceği gibi veritabanında bulunan bütün kolonlar için topluca istatistik oluşturulması mümkündür. Bu amaç için kullanılan obje sp_createstats sistem prosedürüdür. Örneğin aşağıdaki kod ile veritabanında bulunan bütün uygun kolonlar için istatistik oluşturulabilir. (Live Sistemde uygularken dikkatli olmalısınız.)EXEC sp_createstats; GOVeritabanındaki tablolarda tanımlı istatistiklerin kapsamı dışında kalan kolonlara istatistik oluşturmak için aşağıdaki komutu kullanabiliriz. Bu komut veritabanında bulunan tüm kolonlar için değil sadece index’lerin birincil olmayan kolonları için istatistik oluşturulacaktır.
EXEC sp_createstats 'indexonly'; GO8 MB’dan büyük tablolarda örneklemin rasgele kayıtlardan değil bütün kayıtlardan yapılabilmesi için sp_createstats sistem prosedüründe FULLSCAN parametresi kullanılabilir.
EXEC sp_createstats 'indexonly', 'FULLSCAN' GOŞimdilik Bu konu hakkında sizlere gösterebileceğim örnekler bu kadar. Devamı için diğer konuları takip edebilir yada Turgay Şahtiyan'ın yazısı buradan edinebilirsiniz.
Güzel bir konu eline sağlık.