MSSQL Index Kontrol Scripti

DataNomad

Yüzbaşı
Katılım
24 Kasım 2025
Mesajlar
310
Reaksiyon puanı
0
MSSQL’de indekslerin kontrolü, veritabanı performansını optimize etmek için kritik bir adımdır. İndeksler, sorguların daha hızlı çalışmasını sağlarken, verilerin düzenli bir şekilde depolanmasına da olanak tanır. Ancak, zamanla indeksler bozulabilir veya gereksiz hale gelebilir. Bu noktada, bir kontrol scripti yazmak, sistem yöneticileri için önemli bir görev haline gelir. SQL Server Management Studio’yu açarak başlayabiliriz. İlk olarak, veritabanınızı seçin... Ardından, aşağıdaki script’i çalıştırarak mevcut indekslerin durumunu kontrol edebilirsiniz:
```sql
SELECT
i.name AS IndexName,
OBJECT_NAME(i.object_id) AS TableName,
i.type_desc AS IndexType,
d.avg_fragmentation_in_percent AS Fragmentation,
d.page_count AS PageCount
FROM sys.indexes AS i
JOIN sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS d
ON i.object_id = d.object_id AND i.index_id = d.index_id
WHERE OBJECTPROPERTY(i.object_id, 'IsUserTable') = 1
ORDER BY Fragmentation DESC;
```
Bu sorgu, her bir indeksin adını, hangi tabloya ait olduğunu, indeks tipini ve parçalanma oranını gösterir. Parçalanma oranı yüksek olan indeksler, sorgu sürelerini uzatabilir ve performansı olumsuz etkileyebilir. Peki, bu durumda ne yapmalı?

Elde edilen verilere göre, yüksek parçalanma oranına sahip indeksleri yeniden düzenlemek veya yeniden oluşturmak gerekebilir. Örneğin, aşağıdaki komut ile belirli bir indeksi yeniden oluşturabilirsiniz:
```sql
ALTER INDEX [IndexName] ON [TableName] REBUILD;
```
Bu işlem, indeksi sıfırlayarak parçalanmayı azaltır ve sorgu performansını artırır. Ancak dikkat edin, bu işlem sırasında tabloya erişim kısıtlamaları olabilir. Özellikle büyük veritabanlarında bu tür işlemleri planlamak oldukça önemlidir; çünkü sistemin genel performansı etkilenebilir.

Aynı zamanda, gereksiz indekslerin varlığı, hem depolama alanını israf eder hem de güncelleme işlemlerini yavaşlatır. Yani, hangi indekslerin kullanılmadığını tespit etmek için şu sorguyu kullanabilirsiniz:
```sql
SELECT
i.name AS IndexName,
OBJECT_NAME(i.object_id) AS TableName,
i.type_desc AS IndexType,
s.user_seeks AS UserSeeks,
s.user_scans AS UserScans
FROM sys.indexes AS i
LEFT JOIN sys.dm_db_index_usage_stats AS s
ON i.object_id = s.object_id AND i.index_id = s.index_id
WHERE OBJECTPROPERTY(i.object_id, 'IsUserTable') = 1
AND (s.user_seeks = 0 AND s.user_scans = 0)
ORDER BY TableName, IndexName;
```
Bu sorgu, hiç kullanılmayan indeksleri listeler. Tabii ki, kullanılmayan indeksleri silmeden önce dikkatli düşünmekte fayda var; belki de ileride ihtiyaç duyulabilir... Ama bazı durumlarda, gereksiz yükten kurtulmak mantıklı bir çözüm olabilir.

Son olarak, indekslerinizi düzenli olarak kontrol etmek, veritabanı yönetiminin vazgeçilmez bir parçasıdır. Bu, sadece performansı artırmakla kalmaz, aynı zamanda sistemin sağlıklı bir şekilde çalışmasını da garanti eder. Unutmayın, her iki ayda bir, bu script’i çalıştırmak... veritabanınızın sağlığını korumak için harika bir yol olabilir. Veritabanı yöneticisi olarak, bu tür önlemler almak, sistemin geleceğini güvence altına alır.
 
Geri
Üst Alt