Bu makalede sql serverda istatistiklerin nasıl güncellendiğini ve bazı sql server istatistik komut satırlarını görmüş olacağız. İstatistik nedir, ne işe yarar konularını hakkında bilgi sahibi olmak isterseniz sayfamızın arama kısmından istatistik başlığı altında görülebilir.
İstatistikler birden fazla yöntemle güncellenebilir. sp_updatestats komutu ile veritabanı altındaki tüm istatistikler güncellenmektedir.
exec sp_updatestats
Yukarıdaki komut ile veritabanı altındaki tüm istatistikler güncellenmektedir. Fullscan işlemi yapmaz.
Güncelleme gerekli değilse, aşağıdaki mesajı alırız.
0 indeks(ler)/istatistik güncellendi, 1 güncelleme gerektirmedi.
0 index(es)/statistic(s) have been updated, 1 did not require update.
Sp_updatestats ile istatistikler güncellenirse, aşağıdaki mesajı alırız.
1 indeks(ler)/istatistik(ler) güncellendi.
1 index(es)/statistic(s) have been updated.

Msforeachdb procedure ile yukarıdaki stored procedure aracılığıyla tüm veritabanlarını güncelleyebiliriz.
exec sp_MSforeachdb 'use [?]; exec sp_updatestats'
Not: sp_updatestats’ı çalıştırmak için gereken izinler sysadmin veya veritabanı sahibi olmaktır.
İkinci olarak istatistikleri güncelleme komutumuz update statistics komutudur. Bu istatistik güncellemesi veritabanı ve tablo bazlı yapılmaktadır. Update statistics komutu ile test veritabanımızda istatistik güncelleme işlemlerimizi yapalım.
Aşağıdaki komut ile veritabanı altındaki tablonun ilgili indexs’i güncelleyerek indexs’e bağlı istatistik otomatik olarak güncellenmiş olmaktadır.
update statistics [AdventureWorks2014].[Person].[Address][IX_Address_StateProvinceID]

İndexs bazlı istatistik güncellemesi yapmayıp tüm tablo altındaki istatistikleri güncellemek için aşağıdaki komut kullanılmaktadır.
update statistics [AdventureWorks2014].[Person].[Address]
Genel olarak aşağıdaki komutlar kullanılır.
update statistics [veritabanı_adı].[sema_adı].[tablo_adı][indexs_adı]
update statistics [veritabanı_adı].[sema_adı].[tablo_adı]
Update statistics komutu ile istatistiklerin güncelleme yöntemleri vardır. Bunlar FULLSCAN-RESAMPLE-SAMPLE yöntemleri olarak karşımıza çıkmaktadır.
Not: Yukarıdaki tanımlanmış olan update statistics komutları fullscan yapmaz. Bu nedenle, SQL Server FULL SCAN gerektirip gerektirmediğine otomatik olarak karar verir.
Not: Tanımlanmış olan view üzerinde indexs tanımlanırsa view artık gerçek bir alan kaplamaktadır.
Not: İstatistikler güncellendiğinde, bu nesnelere başvuran plan önbelleğindeki sorgular bir sonraki çağrıldıklarında yeniden derlenecektir; Bu nedenle, sorguları sık sık yeniden derlemenin genel sistem performansınıza zarar verebileceğinden istatistikleri çok sık güncellememeye dikkat etmelisiniz.
FULLSCAN: Tablo veya indexs viewdeki tüm satırları tarayarak istatistikleri güncellemektedir.
update statistics [veritabanı_adı].[sema_adı].[tablo_adı][indexs_adı] WITH FULLSCAN
Not: SQL Server’da istatistikleri ‘WITH FULLSCAN, NORECOMPUTE‘ seçenekleriyle topladığınızda, bu istatistikler otomatik olarak güncellenmez ve ilk oluşturuldukları haliyle kalırlar. Kısacası büyük tablolarınızı bu şekilde güncelleyip tekrardan istatistik bakım joblarının önüne geçmiş oluruz. Normalde sql server istatistiklerin eski olduğunu tespit ederse istatistikleri güncellemektedir. Ayrıca bakım joblarımızda ise eğer ilgili tablo istatistiği norecompute seçeneğiyle başlangıçta güncellenmişse bu ifadeye dokunmaz.
Aşağıdaki ilk örnekte tablo üzerinde belirtilen indexs üzerinde istatistik güncellemesi yapılmaktadır.
USE AdventureWorks2014
GO
update statistics [Person].[Person] [PK_Address_AddressID] WITH FULLSCAN,NORECOMPUTE
GO
Tüm tablo üzerinde istatistik güncellemesi yapılmaktadır.
USE AdventureWorks2014
GO
update statistics [Person].[Person] WITH FULLSCAN
GO
Not: Indexs birden fazla kolun içeriyorsa sadece ilk kolun için istatistik oluşturmaktadır.
Not: Indexs rebuild işlemlerinde istatistikler otomatik olarak güncellenmektedir. reorganize İşlemlerinde güncelleme olmaz. Manuel yapılması gerekmektedir.
Not: İstatistiklerin fullscan olarak güncellenmesi isteniyorsa ilgili tablonun içeriğinin incelenip yapılması gerekmektedir. Bu şekilde fullscan işlemi yapılırsa indexs bakım joblarının içerisinden istatistik komutlarının çıkarılması gerekmektedir.
SAMPLE: Belirli değer aralığındaki satırları örnek alarak güncelleme işlemi yapılmaktadır. Satır(row) ve yüzde(percent) olarak işlemlerimiz yapılmaktadır.
Aşağıdaki ifade ise belirtilen tablo ve indexs deki 100 satırı baz alarak istatistikleri güncellemektedir.
USE AdventureWorks2014
update statistics [Person].[Person] [AK_Person_rowguid] WITH sample 100 rows
Aşağıdaki komut ile satır sayısını %20 olarak belirlenmiş olan alanı örnek alarak istatistikleri güncelliyor.
USE AdventureWorks2014
update statistics [Person].[Person] WITH sample 20 percent
Not: WITH FULLSCAN yerine WITH SAMPLE 100 PERCENT yan tümcesini de kullanabiliriz ve her ikisi de aynı sonucu döndürür.
RESAMPLE: En son alınan istatistiğin ne şekilde alındığını kullanarak istatistik güncelleme işlemini gerçekleştirmektedir. Eğer önceden istatistik fullscan olarak güncellenmişse bu komut çalıştırıldığında istatistik güncellemesi fullscan olacaktır.
USE AdventureWorks2014
update statistics [Person].[Person] [AK_Person_rowguid] WITH resample
USE AdventureWorks2014
update statistics [Person].[Person] WITH resample
Aşağıdaki komut ile de veritabanı altında bulunan tüm istatistikleri resample komutu ile güncelleyebiliriz.
EXEC sp_updatestats RESAMPLE
Son olarak istatistiklerin SSMS üzerinde güncellemek için ilgili tablo altında bulunan istatistikler bölümünde istatistiğe çift tıklayıp veya sağ tıklayıp properties bölümüne tıkladığımızda, alt kısımda bulunan last updated bölümünde son güncelleme tarihini ve bir altında bulunan Update statistics for these columns bölümünü işaretleyip ilgili istatistiği güncelleme işlemi yapabiliriz.

Otomatik olarak oluşturulan SQL Server istatistikleri tek sütunlu istatistiklerdir.

İstatistiklerin otomatik isimle(Wa) ile oluşmasını istemiyorsak aşağıdaki sorgu çalıştırıldığında ilgili tablo altında bulunan tüm kolonlarla ilgili istatistik oluşmaktadır.
EXEC sp_createstats @indexonly = 'NO', @fullscan = 'FULLSCAN', @norecompute ='NO'

Not: İstatistikleri güncellemek için YÜZDE 0 veya 0 Satırları belirtmemeliyiz çünkü bu yalnızca istatistik nesnesini günceller, ancak istatistik verilerini içermez.
Not: SAMPLE’ı yalnızca belirli gereksinimler altında kullanmalıyız. Daha az örnek boyutu alabiliriz ve sorgu iyileştiricinin uygun planı seçmesi uygun olmayabilir.
İstatistikleri FULLSCAN ile güncelleme:
FULLSCAN ile istatistikleri güncellediğimizde tabloya erişim kesilmez. SQL Server istatistik güncelleme işlemi sırasında tabloyu kilitlemez, yani okuma işlemleri yapılabilir. Ancak bazı durumlarda geçici I/O yavaşlamaları yaşanabilir. Eğer UPDATE STATISTICS işlemi sırasında paralel işlem desteklemeyen bir yapıdaysa (örneğin düşük donanım), bekleme süreleri artabilir.
DML İşlemleri Etkilenebilir (INSERT/UPDATE/DELETE): Özellikle büyük tablolarda FULLSCAN işlemi uzun sürebileceğinden, aynı anda tabloya yazmaya çalışan işlemler yavaşlayabilir veya lock escalation (kilit yükselmesi) nedeniyle bekleyebilir.
FULLSCAN tüm tabloyu okuduğu için, TempDB ve disk I/O üzerinde yük oluşturabilir.
Not: UPDATE STATISTICS komutunda MAXDOP parametresi doğrudan desteklenmez. Ancak SQL Server’ın genel MAXDOP ayarları, istatistik güncelleme sırasında kullanılan cpu sayısını etkiler. Güncelleme komutumuz Cost threshold for Parallelism değerini aşarsa Max degree of Parallelism değerini kullanabiliriz.
Ola hallengren scriptlerinde istatistikleri güncellerken maxdop kullanılır. Database çok büyükte olsa genellikle tercih edilmez. Cost threshold parallelism gerekirse devreye girer.
Bu makalede baştan sona istatistik güncelleme komutları görmüş olduk. Başka bir makalede görüşmek dileğiyle..
“İlminle övünme, Şeytan’a bak!” Araf-12