## Kedy použiť Keď používatelia hlásia pomalé transakcie, ale celkové CPU servera je nízke. ## Ako čítať výsledok `avg_duration_ms` výrazne väčšie než `avg_cpu_ms` = dotaz väčšinou čaká (zámky, I/O, pamäť), nie počíta. > [!WARNING] > Plan cache nie je história – po reštarte, recompile alebo vyhodení plánu sa údaje strácajú. Parameter `MinExecutions` skrýva jednorazové dotazy; pri hľadaní jedného dlhého behu ho zníž na 1. **Oprávnenia:** `VIEW SERVER STATE` (na SQL Server 2022 stačí aj `VIEW SERVER PERFORMANCE STATE`). **Režim:** READ ONLY · **Verzia:** SQL Server 2016 – 2022 ## Súvisiace recepty - [Top 20 dotazov podľa CPU](script.php?id=5&s=top-20-dotazov-podla-cpu) - [Query Store – top dotazy podľa CPU](script.php?id=25&s=query-store-top-dotazy-podla-cpu)
Skript
Najpomalšie dotazy podľa priemerného trvania (plan cache)
Statementy z plan cache s najvyšším priemerným trvaním, s CPU a čítaniami na jedno vykonanie.
Parametre skriptu doplň a kopíruj hotový skript
/* DeadlockCafe | Najpomalšie dotazy podľa priemerného trvania (plan cache)
Účel: Statementy z plan cache s najvyšším priemerným trvaním, s CPU a čítaniami na jedno vykonanie.
Režim: READ ONLY | SQL Server 2016 – 2022, on-premises
*/
SET NOCOUNT ON;
DECLARE @MinExecutions bigint = {{MinExecutions:3}};
SELECT TOP (30)
qs.execution_count, qs.last_execution_time,
CAST(qs.total_elapsed_time / 1000.0 / NULLIF(qs.execution_count, 0) AS decimal(18,2)) AS avg_duration_ms,
CAST(qs.max_elapsed_time / 1000.0 AS decimal(18,2)) AS max_duration_ms,
CAST(qs.total_worker_time / 1000.0 / NULLIF(qs.execution_count, 0) AS decimal(18,2)) AS avg_cpu_ms,
CAST(qs.total_logical_reads * 1.0 / NULLIF(qs.execution_count, 0) AS decimal(18,1)) AS avg_logical_reads,
DB_NAME(t.dbid) AS compilation_database,
SUBSTRING(t.text, qs.statement_start_offset / 2 + 1,
((CASE WHEN qs.statement_end_offset = -1 THEN DATALENGTH(t.text)
ELSE qs.statement_end_offset END - qs.statement_start_offset) / 2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS t
WHERE qs.execution_count >= @MinExecutions
ORDER BY qs.total_elapsed_time * 1.0 / NULLIF(qs.execution_count, 0) DESC;