Discussion

Index Fragmentation Scripti

Started by Celal · 26 Jul 2026 14:36 · 2 Views · 0 Replies
Thread Starter #0
Veritabanı yönetimi, performansı artırmak ve sistem kaynaklarını verimli bir şekilde kullanmak için kritik öneme sahiptir. Bu bağlamda, indeks parçalanması veritabanı performansını olumsuz etkileyebilir. İndeks parçalanması, veritabanındaki kayıtların fiziksel düzeninin bozulması anlamına gelir. Bu durum, sorgu sürelerinin uzamasına ve genel sistem performansının düşmesine yol açabilir. Bu yazıda, indeks parçalanmasını tespit etmek ve düzeltmek için kullanabileceğiniz basit bir SQL script örneği paylaşacağım.

İlk olarak, indeks parçalanmasını kontrol etmek için aşağıdaki SQL sorgusunu kullanabilirsiniz:

CODE
123456789101112131415SELECT 
    OBJECT_NAME(S.[object_id]) AS [TableName],
    I.[name] AS [IndexName],
    PS.[avg_fragmentation_in_percent],
    PS.[page_count]
FROM 
    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS PS
INNER JOIN 
    sys.indexes AS I ON PS.[object_id] = I.[object_id] AND PS.[index_id] = I.[index_id]
INNER JOIN 
    sys.objects AS S ON I.[object_id] = S.[object_id]
WHERE 
    PS.[avg_fragmentation_in_percent] > 10 AND PS.[page_count] > 1000
ORDER BY 
    PS.[avg_fragmentation_in_percent] DESC;


Bu sorgu, belirli bir yüzdeyi aşan (örneğin %10) ve yeterli sayıda sayfaya sahip (örneğin 1000) parçalanmış indeksleri listeleyecektir. Bu bilgileri topladıktan sonra, indeksleri yeniden düzenlemek için bir script oluşturabilirsiniz. Aşağıda, parçalanmış indeksleri yeniden düzenlemek için kullanabileceğiniz bir örnek script yer almaktadır:

CODE
1234567891011121314151617181920212223242526272829DECLARE @TableName NVARCHAR(256)
DECLARE @IndexName NVARCHAR(256)
DECLARE @SQL NVARCHAR(MAX)

DECLARE index_cursor CURSOR FOR 
SELECT 
    OBJECT_NAME(S.[object_id]) AS [TableName],
    I.[name] AS [IndexName]
FROM 
    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS PS
INNER JOIN 
    sys.indexes AS I ON PS.[object_id] = I.[object_id] AND PS.[index_id] = I.[index_id]
INNER JOIN 
    sys.objects AS S ON I.[object_id] = S.[object_id]
WHERE 
    PS.[avg_fragmentation_in_percent] > 10 AND PS.[page_count] > 1000

OPEN index_cursor
FETCH NEXT FROM index_cursor INTO @TableName, @IndexName

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQL = 'ALTER INDEX ' + QUOTENAME(@IndexName) + ' ON ' + QUOTENAME(@TableName) + ' REBUILD'
    EXEC sp_executesql @SQL
    FETCH NEXT FROM index_cursor INTO @TableName, @IndexName
END

CLOSE index_cursor
DEALLOCATE index_cursor


Bu script, belirlenen kriterlere uyan her bir parçalanmış indeksi yeniden inşa edecektir. İndekslerin yeniden düzenlenmesi, sorgu performansını artırabilir ve veri erişim sürelerini azaltabilir. Ancak, bu işlemi yapmadan önce veritabanının yedeğini almak her zaman iyi bir uygulamadır.

Sonuç olarak, indeks parçalanması yönetimi, veritabanı performansını iyileştirmek için önemli bir adımdır. Yukarıdaki scriptler, bu süreçte size yardımcı olabilir. Veritabanı yönetimi konusunda başka öneriler veya deneyimleriniz varsa, paylaşmaktan çekinmeyin.

You must be logged in to reply.

0 quotes selected