Ana içeriğe geç
Kesit SQL
Orta · Veritabanı Yönetimi (DBA)

Gerçek görünümler: DMV, bekleme istatistiği, Query Store kataloğu

Operasyon yolunda kurgu günlükle öğrendiğin teşhisi gerçek sistem görünümü yazımıyla yazmak.

Uygulamada aç, 10 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Hangi soru, hangi görünüm

SoruGörünümÖmür
En çok kaynak yiyen sorgusys.dm_exec_query_stats + sys.dm_exec_sql_textPlan önbellekte kaldığı sürece
Sunucu neyi bekliyorsys.dm_os_wait_statsBaşlatmadan beri toplam
Bu sorgu dün nasıldı, plan değişti misys.query_store_*Veritabanında kalıcı, saklama ayarına bağlı
Burası kurgu kopyaBu tarayıcı motoru gerçek sistem görünümü çalıştırmaz. T-SQL modunda 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.
ÖnkoşulTeşhis mantığı SQL Server Operasyon ve Güvenlik yolundaki parmak izi ve plan değişimi derslerinde. Burada aynı mantığın gerçek yazımı var.

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;
Kör noktaGörünüm önbellekteki planları gösterir. Yordam düzeyinde 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_YIELDCPU baskısı
WRITELOGGü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.

Alıştırmalara geç (10)