Hangi soru, hangi görünüm
| Soru | Görünüm | Ömür |
|---|---|---|
| En çok kaynak yiyen sorgu | sys.dm_exec_query_stats + sys.dm_exec_sql_text | Plan önbellekte kaldığı sürece |
| Sunucu neyi bekliyor | sys.dm_os_wait_stats | Başlatmadan beri toplam |
| Bu sorgu dün nasıldı, plan değişti mi | sys.query_store_* | Veritabanında kalıcı, saklama ayarına bağlı |
sys.dm_*, sys.query_store_*, msdb.dbo.* yazımı, hayali bir portal için elle kurulmuş tablolara yönlenir. Yazım ve sütun adları gerçekle aynıdır, ama yalnız seçili sütunlar var ve sayılar ölçüm değildir. Parametre alan görünümlerde (sys.dm_db_index_physical_stats) parametreler yok sayılır, bütün satırlar döner; süzmek için WHERE yaz. Gerçek sunucuda aynı sorgu için yetki gerekir: SQL Server 2022 ve sonrasında VIEW SERVER PERFORMANCE STATE, öncesinde VIEW SERVER STATE.En pahalı sorgular
sys.dm_exec_sql_text tablo değerli işlevdir, her satır için CROSS APPLY ile çağrılır. Süre ve CPU sütunları mikrosaniyedir; sütun toplamdır, ortalama için çalışma sayısına böl.
SELECT TOP (3) st.text AS sorgu, qs.execution_count AS calisma,
qs.total_worker_time / 1000 AS toplam_cpu_ms
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY qs.total_worker_time DESC;
WITH RECOMPILE ile çalışan ya da önbellekten düşen sorgu görünmez, sunucu yeniden başlayınca hepsi gider. Kalıcı geçmiş için Query Store.Bekleme istatistiği
Toplam bekleme wait_time_ms; bunun signal_wait_time_ms kısmı kaynağı aldıktan sonra işlemci sırası beklemektir. Listenin başında zararsız arka plan beklemeleri olur, süz. Küçük örnek:
SELECT TOP (4) wait_type, wait_time_ms, signal_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type NOT IN ('LAZYWRITER_SLEEP', 'SLEEP_TASK', 'BROKER_TO_FLUSH')
ORDER BY wait_time_ms DESC;
| Bekleme | İlk bakılacak yer |
|---|---|
LCK_M_* | Engelleme: uzun işlem |
PAGEIOLATCH_* | Diskten okuma: eksik indeks, tarama, bellek |
SOS_SCHEDULER_YIELD | CPU baskısı |
WRITELOG | Günlük diski |
Query Store kataloğu
Yol: metin → sorgu → plan → çalışma istatistiği → zaman aralığı. avg_duration mikrosaniye, avg_logical_io_reads 8 KB sayfadır. Bir plan her aralık için ayrı satır verir; toplamken çalışma sayısıyla ağırlıklandır. Aralık zamanları UTC'dir.
SELECT q.query_id, p.plan_id, SUM(rs.count_executions) AS calisma,
SUM(rs.count_executions * rs.avg_duration) / SUM(rs.count_executions) / 1000 AS ort_ms,
SUM(rs.count_executions * rs.avg_logical_io_reads) / SUM(rs.count_executions) AS ort_okuma
FROM sys.query_store_query AS q
JOIN sys.query_store_plan AS p ON p.query_id = q.query_id
JOIN sys.query_store_runtime_stats AS rs ON rs.plan_id = p.plan_id
WHERE q.query_id = 8
GROUP BY q.query_id, p.plan_id
ORDER BY p.plan_id;
-- Çalışmaz, başvuru: motorda plan yok EXEC sp_query_store_force_plan @query_id = 8, @plan_id = 21;
Extended Events
Oturumu tanımlarsın, olayları hedefe (dosya, halka tampon) yazar. Varsayılan system_health oturumu deadlock kayıtlarını zaten tutar. Motorda çalışmaz; deadlock kaydı okuma Engelleme, deadlock, izolasyon dersinde.