Mevcut veritabanındaki belirli bir nesnenin istatistik özelliklerini görüntülemek için DMV sys.dm_db_stats_properties kullanabiliriz. AdventureWorks2014 veritabanında Person tablosunda bulunan istatistikleri görüntüleyebiliriz.
use [AdventureWorks2014]
SELECT sp.stats_id,
name,
filter_definition,
last_updated,
rows,
rows_sampled,
steps,
unfiltered_rows,
modification_counter
FROM sys.stats AS stat
CROSS APPLY sys.dm_db_stats_properties(stat.object_id, stat.stats_id) AS sp
WHERE stat.object_id = OBJECT_ID('[Person].[Person]');

Not: Where ifadesi yorum satırı olarak yapılırsa veritabanı altında bulunan tüm tablolar için sonuç dönmektedir.
- Name: İlgili istatistiğin adının olduğu bölümdür.
- Last_updated: Son istatistik güncellemesinin tarihi ve saatidir
- Rows: Son istatistik güncellemesi sırasındaki toplam satır sayısını gösterir
- Rows_sampled: İstatistikler için toplam örnek satır sayısını verir. Bu istatistiğin kaç satır üzerinden güncellendiğini göstermektedir. Fullscan işleminin yapılmadığını göstermektedir.
- Unfiltered_rows: Ekran görüntüsünde, istatistiklerde herhangi bir filtre kullanmadığımız için hem rows hem de unfiltered_rows değerini aynı görebilirsiniz
- Modification_counter: Bakmak için hayati bir sütundur. Son istatistik güncellemesinden bu yana yapılan toplam değişiklik sayısını alıyoruz. Bu kısım ile istatistikleri güncelleyip güncellemeyeceğimize karar verebiliriz.
Aşağıdaki resimde gerçek bir sistemden alınmış istatistik değerlerindeki değişimi görebiliriz. modification_counter bölümünde ilgili istatistik değişimini görebilirsiniz. Bu değişimlere göre istatistik güncelleme olup olmadığı görülebilir.

Yukarıda belirtilen tabloda bulunan bir istatistiği güncellediğimizde modification_counter değerinin düştüğünü ilgili istatistiğin güncel olduğunu görmüş oluyoruz.

Aşağıdaki komutla istatistiği fullscan işlemi ile yaptıktan sonra rows_sampled ifadesinin rows sayısıyla aynı olduğunu göstermektedir.
update statistics [Person].[Person]PK_Person_BusinessEntityID with fullscan

Not: Herhangi bir koluna indexs tanımlanmışsa indexs ismi ile istatistik ismi aynı olarak görülmektedir.
Not: İstatistiği fullscan yaptıktan sonra normal istatistik güncelleme jobıyla güncellersek fullscan yapısı bozulur.
Not: Sql server iç algoritmaları büyük tablolar için genelde minumum %1-%3 arasında örnekleme yapmayı tercih eder. Bu örneklem hız ile doğruluk arasında bir denge sağlamaktadır. Küçük tabloları fullscan yapmak ortak ölçekli tabloları(100K-5M) sample yapmak gerekir. Büyük tablolarda percent değerini yüksek tutmak performans anlamında iyidir. Sql server aslında kendisi karar verir. Aşağıdaki resimde dikkat edilirse tablo küçük olduğu için fullscan işlemi yapılmıştır.

Not: Sql server uygun maliyetli bir yürütme planı hazırlamak için where ifadesinden sonra gelen ve indexs’i olmayan her şart için bir istatistik değeri oluşturmaktadır. Otomatik İstatistik Oluşturma adı _WA ile başlar. Daha detaylı bilgi için sayfamızda ilgili makale okunabilir.
Eğer veritabanı altındaki tüm tablolar için istatistik değerlerini almak isterseniz aşağıdaki komut kullanılmaktadır.
SELECT
s.name AS schema_name,
t.name AS table_name,
st.name AS stat_name,
st.stats_id,
sp.last_updated,
sp.rows,
sp.rows_sampled,
sp.steps,
sp.unfiltered_rows,
sp.modification_counter
FROM sys.tables AS t
INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id
INNER JOIN sys.stats AS st ON t.object_id = st.object_id
CROSS APPLY sys.dm_db_stats_properties(st.object_id, st.stats_id) AS sp
WHERE t.is_ms_shipped = 0 -- sistem tablolarını hariç tut
ORDER BY s.name, t.name, st.name;

Kod aşağıdaki şekilde güncellenirse instance altında tüm veritabanları için komutumuz çalışmaktadır.
exec sp_MSforeachdb'
use [?]
SELECT top 5
''?'' as database_name,
s.name AS schema_name,
t.name AS table_name,
st.name AS stat_name,
st.stats_id,
sp.last_updated,
sp.rows,
sp.rows_sampled,
sp.steps,
sp.unfiltered_rows,
sp.modification_counter
FROM sys.tables AS t
INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id
INNER JOIN sys.stats AS st ON t.object_id = st.object_id
CROSS APPLY sys.dm_db_stats_properties(st.object_id, st.stats_id) AS sp
WHERE t.is_ms_shipped = 0 -- sistem tablolarını hariç tut
ORDER BY s.name, t.name, st.name;'
Bu makalede MSSQL Server Değişen İstatistik Özelliklerini Görüntüleme scriptlerini görmüş olduk. Başka bir makalede görüşmek dileğiyle.
“Dünya hayatı yalnızca bir oyun ve bir oyalanmadan başkası değildir. Korkup-sakınmakta olanlar için ahiret yurdu gerçekten daha hayırlıdır. Yine de akıl erdirmeyecek misiniz? “En’am Suresi, 32. Ayet