Incremental Statistics Nedir
SQL Server 2014 ile gelen bir özelliktir. Eğer veritabanınızda partition varsa çok işinize yarayabilir. Partition yoksa bir işinize yaramayacaktır. Auto Update Statistics’i True yaparsanız tablodaki satır değişikliği %20’yi geçtiğinde istatistikler güncelleniyordu. Auto Create Incremental Statistics’i True yaparsanız bu işlem partition bazında gerçekleşir. Büyük veritabanlarında istatistik güncelleme işlemini partition bazında yaparak istatistik güncellemenin sisteme getireceği yükü azaltabilirsiniz.
Aşağıdaki script yardımıyla veritabanı seviyesinde auto create incremental statistics’i true yapabilirsiniz. Bu işlemi gerçekleştirdikten sonra artık veritabanı seviyesinde partition yapılmış tablolarda yeni bir istatistik oluşacağı zaman incremental yapıda oluşacaktır.
ALTER DATABASE test SET AUTO_CREATE_STATISTICS ON ( INCREMENTAL = ON )
Mevcut bir istatistiğin incremental yapıda olup olmadığını aşağıdaki sorgu yardımıyla öğrenebilirsiniz.
USE AdventureWorks2014Yeni GO SELECT OBJECT_NAME(object_id) TableName ,name ,is_incremental ,stats_id FROM sys.stats WHERE name = 'PK_EmployeeID'
Aşağıdaki script yardımıyla da bir istatistiği partition bazında update edebilirsiniz.
UPDATE STATISTICS [VeritabaniAdi].[SemaAdi].[TabloAdi] (IstatistikAdi) WITH RESAMPLE ON PARTITIONS(1)
Eğer istatistik incremental yapıda değilse aşağıdaki gibi hata alırsınız.
Msg 9111, Level 16, State 1, Line 13
UPDATE STATISTICS ON PARTITIONS syntax is not supported for non-incremental statistics.
Aşağıdaki script yardımıyla da mevcut bir istatistiği incremental yapıya geçirebilirsiniz. Bu script’i çalıştırdıktan sonra artık yukardaki hatayı almadan partition yapılmış tablolardaki istatistiklerinizi partition bazında update edebileceksiniz.
UPDATE STATISTICS [EBYSDB].[dbo].[DocumentAttachment] (IX_DocumentAttachment_DocumentId) WITH INCREMENTAL = ON
Veritabanındaki tüm partition yapılmış tablolardaki tüm istatistikler için yukardaki script’i veren script’i aşağıda bulabilirsiniz. Script’te AND tbl.name=’TabloIsmi’ kısmının başındaki – – işaretini kaldırıp TabloIsmi yerine bir tablo ismi yazarsanız sadece ilgili tablo için gerekli script’i çıkaracaktır.
SELECT DISTINCT 'UPDATE STATISTICS ' + QUOTENAME(object_name(s.object_id)) + ' (' + QUOTENAME(s.name) + ') WITH INCREMENTAL = ON' FROM sys.tables tbl INNER JOIN sys.indexes ind ON tbl.object_id = ind.object_id INNER JOIN sys.data_spaces ds ON ind.data_space_id = ds.data_space_id INNER JOIN sys.stats s ON ind.object_id = s.object_id WHERE ds.type = 'PS' --AND tbl.name='TabloIsmi' AND s.is_incremental = 0
İstatistikler hakkında daha detaylı bilgi almak için “SQL Server’da İstatistik Kavramı ve Performansa Etkisi” isimli makaleyi okumanızı tavsiye ederim.
Bir istatistiğin verileri dağıtımı hakkında detaylı bilgi almak içinde “DBCC SHOW_STATISTICS Nedir ve Nasıl Kullanılır” isimli makaleyi okumanızı tavsiye ederim.