DBCC SHOW_STATISTIK  ve SQL Server İstatistikleri Nerede Saklanır

SQL Server’daki istatistikler ikili büyük nesnelerde (BLOB’lar) saklanır ve aşağıdaki sistem katalog görünümleri ve DMV’ler kullanılarak erişilebilir.

  1. sys.stats

İstatistiklerin isim, otomatik oluşturulup oluşturulmadığı gibi genel bilgilerini vermektedir.

SELECT * FROM sys.stats

WHERE object_id = OBJECT_ID('[Person].[Address]')
  • sys.stats_columns
  • sys.dm_db_stats_properties
  • sys.dm_db_stats_histogram

Yukarıdaki komutlarla belirli stast_id değerini belirterek ilgili istatistik için detaylı bilgiye bakılabilir.

select*from sys.dm_db_stats_properties(object_id('person.person'),2)

select*from sys.dm_db_stats_histogram(object_id('person.person'),3)

Ancak, nesne istatistiklerini görüntülemek için çok daha kolay bir yöntem DBCC SHOW_STATISTICS komutunu kullanmaktır. Aşağıda, Sales.SalesOrderDetail tablosundaki bir dizin ve ikinci olarak bir sütun için oluşturulan istatistiklere bakmak için iki örnek bulunmaktadır.

DBCC SHOW_STATISTICS(Tablo_Adı, İstatistik_Adı)

DBCC SHOW_STATISTICS(Tablo_Adı, İndexs_Adı)

DBCC SHOW_STATISTICS ("Sales.SalesOrderHeader",IX_SalesOrderHeader_CustomerID)

DBCC SHOW_STATISTICS, bir tabloda veya dizinli görünümde verilen bir istatistiğin gerçek durumunu gösterir. Bu komutun çıktısı üç öğeden oluşur; Statistics Header, Density Vector(yoğunluk vektörü) ve Histogram. Bu kavramları derinlemesine inceleyeceğiz, ancak önce size en temel sözdizimini ve çıktısını göstereceğim.

DBCC SHOW_STATISTICS('Production.Product', [AK_Product_Name])

Yukarıdaki 1 bölüm StatisticsHeader, 2 bölüm Density Vector,3 bölüm Histogram olarak karşılaşılmaktadır.

Aşağıdaki bölüm Statistics Header bölümündeki açıklamaları görmekteyiz.

Statistics Header

Sütun adıTanım
Nameİstatistik adı.
Updatedİstatistikler son kez güncellendiği tarih.
RowsBu, istatistiklerin en son güncellendiği anda tablo ve index viewdeki toplam satır sayısını temsil eder. İstatistiklerinizin güncelliğini yitirip yitirmediğini görmenin kolay bir yolu, bu sayıyı tablodaki gerçek satır sayısıyla karşılaştırmaktır.
Rows Sampledİstatistikleri oluşturmak için örnek alınan  satır sayısıdır. Fullscan işleminde bu değerler birbirine eşit olmaktadır.
StepBu histogramdaki adım sayısıdır. Histogram bölümünde bahsi geçecek konu.
DensityBu öğe sorgu iyileştiricisi tarafından kullanılmaz ve yalnızca geriye dönük uyumluluk içindir.
Average Key Lengthİstatistikleri oluşturan sütun veya sütun kümesinin bayt cinsinden ortalama boyutu.
String Indexİstatistikler, “Where Column LIKE ‘%Value’” biçimindeki tahminler için optimizasyonu iyileştirmek amacıyla özetlenmiş istatistikler içeriyorsa, bu değer EVET olarak ayarlanır. Kısacası string bir ifade varsa yes değeridir.
Filter Expressionİstatistikler filtrelenirse filtre yordamını gösterir, aksi takdirde NULL olarak ayarlanır.
Unfiltered Rowsİstatistikler filtrelenirse, filtre uygulanmadan önce tablodaki satır sayısını gösterir. Aksi takdirde bu değer toplam rows sayısına  eşittir.

Density Vector

2.912151E-10 ve 2.805216E-10 gibi çok küçük değerler, bu sütun(lar)ın yüksek seçiciliğe (high selectivity) sahip olduğunu gösterir. SIRNMR sütununda neredeyse her değer benzersiz demektir (eşsiz/unique’e yakın).

Sütun adıTanım
All Density(Tüm yoğunluk)Bu 0 ile 1 arasında bir sayıdır. 1/n olarak tanımlanır, burada n farklı değerlerin sayısıdır. Yoğunluk sıfıra ne kadar yakınsa anahtar değeri o kadar benzersizdir, bu yüzden aday anahtarların yoğunluğu daha düşüktür.
Average Lengthİstatistikleri oluşturan sütun veya sütun kümesinin bayt cinsinden ortalama boyutu. 8 veya 16 gibi değerler, bu sütun(lar)daki verilerin ortalama byte cinsinden boyutudur. 8 değerini integer bir olarak kabul edebiliriz.
ColumnsAll Density ve Average Length değerlerinin görüntülendiği örnekteki sütunların adları.

Density Vector Neden Önemli?
SQL Server, bu istatistikleri sorgu performansı için kullanır. Örneğin:
All Density değeri düşükse, sorgu optimizörü bu sütunun filtreleme için iyi bir aday olduğunu düşünür.
Average Length, bellek tahsisi ve I/O maliyetini hesaplamada kullanılır.

Histogram

Histogram, bir veri grubundaki değerlerin sınıflandırılmasıdır. Histogramlar, bir veri kümesinin frekans dağılımını görmemizi sağlar.

Sütun adıTanım
RANGE_HI_KEYBir histogram adımındaki son değer
RANGE ROWSİlk HI_KEY değeri ile bir sonraki HI_KEY arasında kalan tahmini satır sayısı. Where koşulunda iki aralık belirtilirse dönen sonuç ikinci adımın yanında bulunan range
EQ_ROWSHistogram adımındaki satırların tahmini sayısı.
DISTINCT_RANGE_ROWSHistogram adımındaki tekil olan değerlerin sayısı
AVG_RANGE_ROWSBir histogram adımında yinelenen sütun değerlerine sahip satırların ortalama sayısı. DISTINCT_RANGE_ROWS sıfırdan büyük olduğunda RANGE_ROWS’u DISTINCT_RANGE_ROWS’a bölerek hesaplanır, aksi takdirde değeri 1’dir.

Bir istatistik nesnesinin histogramı aşağıdaki sorgu ile alınabilir:

DBCC SHOW_STATISTICS (table_name, statistics_name) WITH HISTOGRAM

İstatistikler oluşturulurken sql serverde yaptığımız select sorgusu gibi davranmaz. Satırları okuyarak onları yukarıdaki resimdeki gibi  parçalara ayırır. Yukarıdaki 261285, 514828 , 667272 gibi. Ve bunlar arasındaki satır sayılarını tahmin eder(estimated row number)

Dikkat ederseniz 261285, 514828 arasında 310810 satır olduğunu ifade etmektedir.  310810 satır  sayısının 253542   satırının tekil olduğunu  DISTINCT_RANGE_ROWS bölümünden anlıyoruz.

İlgili değerler birbirine bölünerek avg_range_rows değerimiz ortaya çıkmaktadır.( 1.225874)

AVG_RANGE_ROWS: DISTINCT_RANGE_ROWS sıfırdan büyük olduğunda RANGE_ROWS’u DISTINCT_RANGE_ROWS’a bölerek hesaplanır, aksi takdirde değeri 1’dir.                

DBCC SHOW_STATISTICS değerlerini ilgili istatistik üzerine çift  tıkladığımızda Details kısmından görebiliriz.

Bu makalede DBCC SHOW_STATISTICS komutlarının ne işe yaradığı ve sql server istatistiklerinin hangi komutlarla nerede saklandığını görmüş olduk.

Sadece density vectörü görmek için aşağıdaki komut kullanılmaktadır.

dbcc show_statistics(SSSVP,PK__SSSVP__3799936E6E7977FF) with density_vector

Başka bir makalede görüşmek dileğiyle..

“İnkar edenleri ise, dünyada ve ahirette şiddetli bir azapla azaplandıracağım. Onların hiç yardımcıları yoktur.” Al-i İmran Suresi, 56. Ayet

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir