SQL İÇİN YARAYIŞLI ARAÇLAR İNCELEMESİ
“Ben genel kurmay, cumhurbaşkanı, başbakanınızım. Türkiye Cumhuriyeti’nin hemde amerikanın prezınt prezınım dikkat et ayağını denk al.”
Cihangir abimizden başka yukardaki cümleleri sarf edebilecek bir kişi varsa oda şüphesiz ki Ola Hallengren amcamız olacaktır.
Kendisi https://ola.hallengren.com/ ismide bir sitesi var burada yazdığı script ve araçlarını paylaşmakta bugün index maintanence ile ilgili bir bilgi vereceğim.
SQL Server Index and Statistics Maintenance
https://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html
Aşağıdaki linkten index maintanence ile ilgili scriptleri indirebilirsiniz. Maintanence Solution komple indirip diğer araçlarıda indirebilirsiniz ama ben şimdilik sadece indexle ilgili olan objeleri alacağım bunlar için
https://ola.hallengren.com/scripts/IndexOptimize.sql
https://ola.hallengren.com/scripts/CommandExecute.sql
https://ola.hallengren.com/scripts/CommandLog.sql
Yukarıdaki üç sql scrpitine ihtiyacımız olacak birincisi indexlemeyi yapan ikincisi Loglama için komut çalıştıran üçüsü ise log tablosunun semasının tutulduğu sql scriptleri. Sıralama çok önemli olmasada önce tablo sonra commandexecute sonra indexoptimize çalıştırırsanız herhangi bir hata ve uyarı almayacaksınız.
Bu scriptleri istediğiniz herhangi bir database içerisinde çalıştırabilirisiniz.
Öncelikle indexlerimizin ne durumda olduğuna bakmak isteyebiliriz bunun için
SELECT dbschemas.[name] as 'Schema', dbtables.[name] as 'Table', dbindexes.[name] as 'Index', indexstats.avg_fragmentation_in_percent, indexstats.page_count FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id] INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id] INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id] AND indexstats.index_id = dbindexes.index_id WHERE indexstats.database_id = DB_ID() ORDER BY indexstats.avg_fragmentation_in_percent desc
Yukarıdaki Sorguyu kullanabiliriz.
Eğer sunucu çok meşgulse fragmante olmuş çok fazla index varsa bunları tek tek yapmak isteyebilirisiniz bu sayade live sistemlerde sorun oluşturmamış olursunuz lakin, ben index rebuild ve reorganize işlemlerinin çok büyük sıkıntı yarattığını görmedim ama yinede dikkatli olmakta fayda var genelde bu scriptler için maintanence plan hazırlayıp geceleri çalıştırmakta fayda var lakin biz bu tool ile daha hızlı bir şekilde işlemlerimizi halletmeye çalışacağız ayrıca Express edition ürünü kullanıyor ise maintanence plan kullanmak mümkün olmuyor.
Bütün hazırlıklarımız tamam dağılmış indexlerimizin olduğunuda gördük artık bunları düzeltmeye başlayabiliriz.
EXECUTE dbo.IndexOptimize @Databases = 'LBS220', @FragmentationLow = NULL, @FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE', @FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE', @FragmentationLevel1 = 5, @FragmentationLevel2 = 30, @MinNumberOfPages = 0, @Indexes = 'LBS220.DBO.%'
Yukarıdaki scripti çalıştırdığımız zaman LBS220 database inde bütün tablolarda %5 den fazla dağılmış indexlerde düzenleme %30 dan fazla dağılmış indexlerde yeniden oluşturma yapacak.
Burada dikkat çekmem gereken bir parametre MinNumberOfPages olacaktır. Normalde Microsoft önerisi ile bu parametre 1000 olmalıdır diyorlar yani 1000 sayfadan fazla sayfaya yayılmamış indexlerin fragmentasyonu ne kadar olursa olsun rebuild gerekmez demektedirler ama ben biraz tertip ve düzen hastası olduğum için bütün indexlere çalıştırıyorum.
Bu script bütün muaddillerine göre çok hızlı ve kusursuz çalışmaktadır.