SQL Server Index Bozulmaları (Fragmentation)

AleynaGulec
Machine Learning Turkiye
3 min readDec 13, 2021

Merhabalar, daha öncesinde Index hakkında yazmış olduğum yazıya yeni bir konu daha ekleniyor, Index Bozulmaları.

Öncesinde index nedir, neden kullanılır ön bilgi almak isterseniz aşağıda paylaşmış olduğum linke göz atmanızı tavsiye ederim.

https://aleynagulec.medium.com/sql-server-index-yap%C4%B1s%C4%B1-31ac91597907

Veritabanımızda kullandığımız içerisinde index tanımlı olan tablolarımızda kayıtlar artmaya başladığı anda index yapısının fragmantasyonlarında bozulmalara yol açacaktır. Devamlı ve fazla seviyede veri girişleri ya da çıkışları indexlerdeki bozulma oranını arttırmaktadır. Eğer bozulmalar fazla oranda ise index’ler çalıştırılan sorgunun performansında yavaşlığa yol açacaktır.

Peki bizler bu durumu nasıl fark edeceğiz, nasıl bir çözüm sunacağız? Hep birlikte bakalım..

Index bozulmalarını manuel olarak arayüz ile tek tek tüm tablolara ait olan index’lere girip properties diyerek aşağıdaki gibi tespit edebiliriz.

Index Bozulma Tespiti

Eğer bu şekilde değil de komut ile bakmak isterseniz aşağıdaki komutu çalıştırmanız index bozulmasını tespit etmek için yeterli olacaktır.

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

Index bozulmamızı tespit ettik. Peki nasıl bir yol izleyeceğiz?

Bu bozulmaları düzeltebilmek için SQL Server bizlere iki yöntem sunuyor. Bunlar, Reorganize ve Rebuild.

Rebuild dediğimiz kavram, var olan indexi drop edip tekrardan oluşturur. Örnekle anlatmak gerekirse bir masanın üstünde dağınık kağıtlar olduğunu düşünelim. O kağıtların hepsini masadan kaldırır ve düzenli bir sekilde tekrardan koyar. Rebuild’de aynı bu şekilde gerçekleşir index’i drop eder, ardından create. Reorganize dediğimiz kavram ise index’i uçurmadan arka tarafta sıralamayı tekrardan yapar. Yani az önceki örneğimizden yola çıkarsak masamızda yer alan dağınık kağıtları düzenlemeyi masanın üstünde halleder.

Reorganize ve Rebuild’in ne olduğunu gördük. Ama hangisini seçmeliyiz?

Eğer fragmantasyon %30'dan küçük ise reorganize kullanmak daha yararlı olacaktır. %30'dan fazla ise rebuild yapmamız gerekmektedir. Bunun sebebi ise %5'lik bir bozulmamız olduğunu düşünelim. Rebuild yapmamız halinde sistemimizi gereksiz yere yoracaktır.

Hangi yöntemi kullanacağımıza karar verdik. Bu iki işlemi nasıl gerçekleştireceğiz?

Aşağıdaki ekran görüntüsünde yer aldığı gibi index’in üzerine sağ tık yaptığımızda rebuild veya reorganize’ı seçebiliriz.

Eğer SQL komutları ile birlikte bu işlemleri gerçekleştirmek istiyorsanız aşağıdaki komutları kullanmanız yeterli olacaktır.

Herhangi bir tablodaki var olan index’leri rebuild eder.

ALTER INDEX ALL ON Table_Name REBUILD

Tablodaki tek bir index’i rebuild eder.

ALTER INDEX Index_Name ON Index_Name REBUILD

Tablodaki tek bir index’i reorganize eder.

ALTER INDEX Index_Name ON Sales.Index_Name REORGANIZE

Umarım sizler için faydalı bir döküman olmuştur. Eğer merak ettikleriniz olursa bana linkedin hesabımdan ulaşabilirsiniz. Bir sonraki yazılarımda görüşmek dileğiyle :)

Bu bozulmaları kontrol ve düzeltmek için , Manuel olarak tek tek tablolardaki indexleri rebuild veya reorganize yapabileceğimiz gibi aşağıdaki sorgularımızda bozulan indexleri tespit edebilir ve tablolarımızdaki indexleri toplu şekilde bakımını yapabiliriz.

--

--