- 23 Kasım 2025
- 1,003
- 59
Veritabanı yöneticileri için MSSQL üzerinde fragmentasyon, zamanla karşılaşılan en yaygın sorunlardan biridir. Bir veritabanı üzerinde yapılan sürekli güncellemeler, silmeler ve eklemeler sonucunda, verilerin fiziksel olarak dağılması ve parçalanması kaçınılmaz hale gelir. Parçalanmış bir veritabanı, performans kaybına neden olur. İşte bu noktada, fragmentasyonu gidermek için bir script yazmak, sistemin verimliliğini artırmak adına harika bir çözüm olabilir. Nasıl mı? Hadi bakalım, birlikte inceleyelim.
Öncelikle, fragmentasyonun ne olduğunu anlamak için biraz temel bilgiye ihtiyaç var. Veritabanı, verileri sayfalara yerleştirir. Ancak bu sayfalar, zamanla boş kalabilir veya dolabilir. Yani, bir veri silindiğinde ya da güncellendiğinde, onun yerini başka bir veri alabilir. Bu durum, veritabanının sayfa düzenini bozarak, performans kaybına yol açar. Fragmentasyon oranı %5'in altındaysa, genellikle bir problem yoktur. Ama %30 ve üzeri bir değer, sistemin yavaşlamasına sebep olabilir. O yüzden bu oranı kontrol etmek, işinize yarayacaktır...
Peki, MSSQL'de fragmentasyonu gidermek için ne yapmalıyız? Öncelikle, sys.dm_db_index_physical_stats sistem görünümünü kullanarak, her bir indeksin fragmentasyon seviyesini inceleyebilirsiniz. Bu görünüm, indekslerin yapısı hakkında detaylı bilgi verir. Örneğin, bir sorgu ile belirli bir veritabanındaki tüm indeksleri kontrol edebilir ve her birinin fragmentasyon seviyesini öğrenebilirsiniz. Bu bilgileri elde ettikten sonra, hangi indekslerin yeniden oluşturulması gerektiğine karar verebilirsiniz.
Şimdi de, fragmentasyonu gidermek için kullanabileceğiniz bir script örneğine bakalım. Bu script, her bir indeks için fragmentasyon seviyesini kontrol eder ve belirli bir seviyenin üzerindeki indeksleri yeniden yapılandırır. Aşağıdaki gibi bir kod parçası işinize yarayabilir:
```sql
DECLARE @dbName NVARCHAR(256) = 'VeritabaniAdi'
DECLARE @tableName NVARCHAR(256)
DECLARE @indexName NVARCHAR(256)
DECLARE @fragmentation FLOAT
DECLARE index_cursor CURSOR FOR
SELECT t.name, i.name, ps.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID(@dbName), NULL, NULL, NULL, 'DETAILED') ps
JOIN sys.indexes i ON ps.object_id = i.object_id
JOIN sys.tables t ON t.object_id = ps.object_id
WHERE i.type_desc = 'NONCLUSTERED' AND ps.avg_fragmentation_in_percent > 30
OPEN index_cursor
FETCH NEXT FROM index_cursor INTO @tableName, @indexName, @fragmentation
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Rebuilding index: ' + @indexName + ' on table: ' + @tableName
EXEC('ALTER INDEX [' + @indexName + '] ON [' + @tableName + '] REBUILD')
FETCH NEXT FROM index_cursor INTO @tableName, @indexName, @fragmentation
END
CLOSE index_cursor
DEALLOCATE index_cursor
```
Bu script, belirli bir fragmentasyon seviyesinin üzerinde bulunan tüm indeksleri yeniden yapılandırır. Tabii ki, bu işlemler öncesinde bir yedek almayı unutmayın. Yani, bir sorun yaşanırsa, geri dönüş yapabilmek için... Zaten her IT profesyonelinin aklında olmalı bu, değil mi?
Son olarak, fragmentasyon giderme işlemleri tamamlandıktan sonra, veritabanınızın performansını kontrol etmeyi ihmal etmeyin. Performans artışı, genellikle hemen hissedilir. Ancak, unutmayın ki, fragmentasyon sadece fiziksel değil, mantıksal anlamda da bir sorundur. Veritabanınızın sağlığı için düzenli bakım yapmak, her zaman iyi bir uygulamadır... Dikkat edin, bu işleri ertelemeyin, çünkü her şeyin bir sonu var, ama veritabanı bakımının her zaman bir başlangıcı olmalı!
Öncelikle, fragmentasyonun ne olduğunu anlamak için biraz temel bilgiye ihtiyaç var. Veritabanı, verileri sayfalara yerleştirir. Ancak bu sayfalar, zamanla boş kalabilir veya dolabilir. Yani, bir veri silindiğinde ya da güncellendiğinde, onun yerini başka bir veri alabilir. Bu durum, veritabanının sayfa düzenini bozarak, performans kaybına yol açar. Fragmentasyon oranı %5'in altındaysa, genellikle bir problem yoktur. Ama %30 ve üzeri bir değer, sistemin yavaşlamasına sebep olabilir. O yüzden bu oranı kontrol etmek, işinize yarayacaktır...
Peki, MSSQL'de fragmentasyonu gidermek için ne yapmalıyız? Öncelikle, sys.dm_db_index_physical_stats sistem görünümünü kullanarak, her bir indeksin fragmentasyon seviyesini inceleyebilirsiniz. Bu görünüm, indekslerin yapısı hakkında detaylı bilgi verir. Örneğin, bir sorgu ile belirli bir veritabanındaki tüm indeksleri kontrol edebilir ve her birinin fragmentasyon seviyesini öğrenebilirsiniz. Bu bilgileri elde ettikten sonra, hangi indekslerin yeniden oluşturulması gerektiğine karar verebilirsiniz.
Şimdi de, fragmentasyonu gidermek için kullanabileceğiniz bir script örneğine bakalım. Bu script, her bir indeks için fragmentasyon seviyesini kontrol eder ve belirli bir seviyenin üzerindeki indeksleri yeniden yapılandırır. Aşağıdaki gibi bir kod parçası işinize yarayabilir:
```sql
DECLARE @dbName NVARCHAR(256) = 'VeritabaniAdi'
DECLARE @tableName NVARCHAR(256)
DECLARE @indexName NVARCHAR(256)
DECLARE @fragmentation FLOAT
DECLARE index_cursor CURSOR FOR
SELECT t.name, i.name, ps.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID(@dbName), NULL, NULL, NULL, 'DETAILED') ps
JOIN sys.indexes i ON ps.object_id = i.object_id
JOIN sys.tables t ON t.object_id = ps.object_id
WHERE i.type_desc = 'NONCLUSTERED' AND ps.avg_fragmentation_in_percent > 30
OPEN index_cursor
FETCH NEXT FROM index_cursor INTO @tableName, @indexName, @fragmentation
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Rebuilding index: ' + @indexName + ' on table: ' + @tableName
EXEC('ALTER INDEX [' + @indexName + '] ON [' + @tableName + '] REBUILD')
FETCH NEXT FROM index_cursor INTO @tableName, @indexName, @fragmentation
END
CLOSE index_cursor
DEALLOCATE index_cursor
```
Bu script, belirli bir fragmentasyon seviyesinin üzerinde bulunan tüm indeksleri yeniden yapılandırır. Tabii ki, bu işlemler öncesinde bir yedek almayı unutmayın. Yani, bir sorun yaşanırsa, geri dönüş yapabilmek için... Zaten her IT profesyonelinin aklında olmalı bu, değil mi?
Son olarak, fragmentasyon giderme işlemleri tamamlandıktan sonra, veritabanınızın performansını kontrol etmeyi ihmal etmeyin. Performans artışı, genellikle hemen hissedilir. Ancak, unutmayın ki, fragmentasyon sadece fiziksel değil, mantıksal anlamda da bir sorundur. Veritabanınızın sağlığı için düzenli bakım yapmak, her zaman iyi bir uygulamadır... Dikkat edin, bu işleri ertelemeyin, çünkü her şeyin bir sonu var, ama veritabanı bakımının her zaman bir başlangıcı olmalı!
