Plan cache'ten en pahalı sorguları bul (CPU, okuma, süre)
SQL ServerPerformansKomut
SELECT TOP (20)
qs.query_hash,
SUM(qs.execution_count) AS execs,
SUM(qs.total_worker_time) / 1000 AS total_cpu_ms,
SUM(qs.total_worker_time) / SUM(qs.execution_count) / 1000 AS avg_cpu_ms,
SUM(qs.total_elapsed_time) / SUM(qs.execution_count) / 1000 AS avg_ms,
SUM(qs.total_logical_reads) / SUM(qs.execution_count) AS avg_reads,
SUM(qs.total_grant_kb) / SUM(qs.execution_count) AS avg_grant_kb,
COUNT(DISTINCT qs.query_plan_hash) AS plan_count,
MAX(qs.last_execution_time) AS last_exec,
MIN(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,
MIN(DB_NAME(pa.dbid)) AS db
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
OUTER APPLY (SELECT CONVERT(int, value) AS dbid FROM sys.dm_exec_plan_attributes(qs.plan_handle)
WHERE attribute = N'dbid') pa
GROUP BY qs.query_hash
ORDER BY total_cpu_ms DESC;
-- Okumaya gore siralamak icin: ORDER BY SUM(qs.total_logical_reads) DESC
-- Plan: SELECT query_plan FROM sys.dm_exec_query_plan(<plan_handle>);Ne yapar?
Plan cache'teki ifadeleri query_hash ile gruplayarak (yalnız literal değeri farklı ad-hoc sorgular tek satırda) toplam ve ortalama CPU, süre, logical read, memory grant ve plan sayısını verir.
Ne zaman kullanılır?
CPU %100'e dayandığında, "sunucu yavaş" şikâyetinde, Query Store kapalı veritabanlarında veya sunucu genelinde (tüm DB'ler) bakış gerektiğinde.
Dikkat
Yalnız cache'te kalan planları görür: restart, DBCC FREEPROCCACHE, memory pressure veya RECOMPILE ile planı atılan sorgular eksik kalır. Kalıcı ve zaman aralıklı analiz için Query Store kullan. plan_count > 1 parametre hassasiyeti veya farklı SET seçenekleri işaretidir. Çok büyük plan cache'te sorgu birkaç saniye sürebilir; risksiz.