SQL Server

SQL Server – İstatistik – Statistic Nedir?

 

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.

clip_image002

TSQL ile de istatistiklerin sorgulanması mümkündür. Bunun için sys.stats Catalog View’i kullanılabilir.

clip_image004

AdventureWorks2012 DB’si üzerinde Sales.Customer Tablosuna ait Stats bulmamızı sağlıyor. Örnek Resim aşağıdadır.

clip_image006

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_helpstatssistem SP’si ile daha kolayca bakılabilir. sp_helpstats ile Sales.Customer tablosunda bulunan istatistikleri aşağıdaki şekilde sorgulayabiliriz.

clip_image008

clip_image010

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.

clip_image012

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 veAuto_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.

clip_image014

İ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.)

clip_image016

Veritabanı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.

clip_image018

8 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.

clip_image020

Şimdilik Bu konu hakkında sizlere gösterebileceğim örnekler bu kadar. Umarım faydalı olur.

İlgili Makaleler

Bir Yorum

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Başa dön tuşu

Reklam Engelleyici Algılandı

ÇözümPark Bilişim Portalı gönüllü bir organizasyon olup tek gelir kaynağı reklamlardır. Bu nedenle siteyi gezerken lütfen reklam engelleme eklentinizi kapatın veya Çözümpark web sitesi için izin tanımı yapın. Anlayışınız için teşekkürler.