SQL Server’da Sunucuyu En Çok Yoran Sorguları Bulma
Posted on Aralık 18, 2025 by
Şaban ÇİÇEK
SQL Server’da Sunucuyu En Çok Yoran Sorguları Bulma (CPU / Süre / IO)
Problem:
“SQL Server yavaş”, “CPU sürekli %90”, “Sunucu nefes alamıyor” gibi sorunların arkasında çoğu zaman birkaç aşırı maliyetli sorgu bulunur. Bu sorgu, sunucuyu en çok yoran SQL’leri CPU, süre ve IO bazında ortaya çıkarır.
“SQL Server yavaş”, “CPU sürekli %90”, “Sunucu nefes alamıyor” gibi sorunların arkasında çoğu zaman birkaç aşırı maliyetli sorgu bulunur. Bu sorgu, sunucuyu en çok yoran SQL’leri CPU, süre ve IO bazında ortaya çıkarır.
Bu sorgu ne işe yarar?
- Sunucu genelinde en çok CPU tüketen sorguları listeler
- Hangi veritabanından geldiğini gösterir
- Toplam ve ortalama çalışma sürelerini hesaplar
- Disk IO (logical read/write) yükünü ortaya koyar
- Gerçek çalıştırılan SQL statement’ı gösterir
Ne zaman kullanılır?
✔ CPU sürekli yüksekse
✔ Sunucu yavaş ama hangi sorgu belli değilse
✔ Canlı sistemde “anlık değil, genel yük” analiz edilecekse
✔ Performans tuning öncesi “nereden başlamalıyım?” sorusu varsa
✔ Sunucu yavaş ama hangi sorgu belli değilse
✔ Canlı sistemde “anlık değil, genel yük” analiz edilecekse
✔ Performans tuning öncesi “nereden başlamalıyım?” sorusu varsa
SQL Sorgusu (CPU’ya Göre En Pahalı Sorgular)
SELECT TOP (20)
DB_NAME(st.dbid) AS database_name,
qs.execution_count,
qs.total_worker_time / 1000 AS total_cpu_ms,
(qs.total_worker_time / 1000) / NULLIF(qs.execution_count, 0) AS avg_cpu_ms,
qs.total_elapsed_time / 1000 AS total_elapsed_ms,
(qs.total_elapsed_time / 1000) / NULLIF(qs.execution_count, 0) AS avg_elapsed_ms,
qs.total_logical_reads AS total_logical_reads,
qs.total_logical_writes AS total_logical_writes,
SUBSTRING(
st.text,
(qs.statement_start_offset / 2) + 1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset
END - qs.statement_start_offset) / 2) + 1
) AS statement_text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
ORDER BY qs.total_worker_time DESC;
Kolonlar ne anlama geliyor?
| Kolon | Açıklama |
|---|---|
| database_name | Sorgunun çalıştığı veritabanı |
| execution_count | Toplam kaç kez çalıştırıldığı |
| total_cpu_ms | Toplam CPU tüketimi (ms) |
| avg_cpu_ms | Çalıştırma başına ortalama CPU |
| total_elapsed_ms | Toplam çalışma süresi |
| avg_elapsed_ms | Ortalama çalışma süresi |
| logical_reads / writes | Disk IO yükü (okuma / yazma) |
| statement_text | Gerçek çalıştırılan SQL kodu |
Bu sorgudan sonra ne yapılmalı?
- En üstte çıkan sorgular için Execution Plan incele
- Table Scan / Key Lookup var mı bak
- Eksik indeksleri belirle
- SELECT * ve fonksiyonlu WHERE şartlarını temizle
- Gerekirse Query Store ile geçmiş performansı kıyasla
Pro ipucu:
Bu DMV sonuçları SQL Server restart edilince sıfırlanır. Kalıcı analiz için mutlaka Query Store ile birlikte kullan.
Bu DMV sonuçları SQL Server restart edilince sıfırlanır. Kalıcı analiz için mutlaka Query Store ile birlikte kullan.
64 görüntülenme •
0 Yorum •
Son Güncelleme: Aralık 18, 2025