Bir sorgu yüksek CPU tüketiyorsa, bu genellikle SQL Server’ın veriye ulaşmak için çok fazla çaba sarf ettiğini gösterir. Çoğu durumda bu çabanın kaynağı, uygun bir indeks bulunmadığı için motorun tüm tabloyu taramak (Index/Table Scan) zorunda kalmasıdır.
SQL Server Query Optimizer (Sorgu Düzenleyici), bir sorguyu çalıştırırken eğer bir indeksin eksikliğini fark ederse, bunu “Execution Plan” (Çalıştırma Planı) içine bir not olarak iliştirir. İşte bu “altın değerindeki” notları filtreleyerek, sistemdeki en büyük performans iyileştirme fırsatlarını yakalayabiliriz.
SQL Server, belleğinde (Plan Cache) tuttuğu istatistikleri sys.dm_exec_query_stats gibi görünümlerde saklar. Aşağıdaki T-SQL sorgusu, sistemde en çok CPU tüketen ilk 500 planı tarar ve sadece içinde “MissingIndexes” önerisi barındıranları karşımıza getirir:
SELECT
qs_cpu.total_worker_time / 1000 AS total_cpu_time_ms,
q.[text] AS query_text,
p.query_plan,
qs_cpu.execution_count,
DB_NAME(q.dbid) AS database_name
FROM
(SELECT TOP 500 qs.plan_handle, qs.total_worker_time, qs.execution_count
FROM sys.dm_exec_query_stats qs
ORDER BY qs.total_worker_time DESC) AS qs_cpu
CROSS APPLY sys.dm_exec_sql_text(qs_cpu.plan_handle) AS q
CROSS APPLY sys.dm_exec_query_plan(qs_cpu.plan_handle) p
WHERE p.query_plan.exist('declare namespace qplan="http://schemas.microsoft.com/sqlserver/2004/07/showplan";
//qplan:MissingIndexes')=1 -- Bu satır, sadece eksik indeks önerisi olan planları filtreler
ORDER BY total_cpu_time_ms DESC;

Bu Yaklaşımın Avantajları Nelerdir?
- Binlerce sorgu arasında kaybolmak yerine, sadece “aksiyon alınabilir” olanlara odaklanırsınız.
- CPU kullanımı, bulut tabanlı sistemlerde (Azure SQL, AWS RDS) doğrudan maliyet demektir. Bu sorguları optimize etmek faturanızı düşürür.
- Kod değişikliği yapmadan, sadece veritabanı seviyesinde bir indeks ekleyerek performansı kat kat artırabilirsiniz.
Sorgu sonucunda elde ettiğiniz eksik indeks önerilerini uygulamadan önce şu üç kuralı unutmamalısınız:
- SQL Server bazen %99 performans artışı vaat etse de, önerdiği kolonlar zaten mevcut bir indeksin içinde olabilir. Yeni bir indeks oluşturmak yerine mevcut indeksi genişletmek (Include columns) daha mantıklıdır.
- Her yeni indeks, INSERT, UPDATE ve DELETE işlemlerini bir miktar yavaşlatır. Okuma ve yazma dengesini gözetmelisiniz.
- Bu veriler SQL Server servisi yeniden başladığında sıfırlanır. Bu nedenle analizinizi sistem yoğun bir şekilde çalışırken yapmanız daha sağlıklı sonuçlar verir.
Veritabanı performansını artırmak her zaman karmaşık kod değişiklikleri gerektirmez. Bazen sistemin size sunduğu ipuçlarını doğru okumak yeterlidir. Yukarıdaki sorgu, sisteminizdeki “en gürültülü” ve çözümü “en kolay” problemleri gün yüzüne çıkaracaktır.
Başka makalede görüşmek dileğiyle..
Anne babaya kaba davranmayın İsra-23
