## Kedy použiť Pri porovnaní výkonu počas testu, regresii po nasadení alebo analýze poslednej hodiny. ## Ako čítať výsledok CPU a trvanie v Query Store sú v mikrosekundách – skript ich prevádza na ms. Riadky sú agregované podľa `query_id` cez všetky plány. > [!WARNING] > Intervaly Query Store môžu presahovať zvolenú hranicu a aktuálny interval sa ešte dopĺňa. Query Store musí byť v stave READ_WRITE alebo READ_ONLY s dátami. **Oprávnenia:** `VIEW DATABASE STATE` (na SQL Server 2022 stačí aj `VIEW DATABASE PERFORMANCE STATE`). Spúšťa sa v cieľovej databáze. **Režim:** READ ONLY · **Verzia:** SQL Server 2016 – 2022 ## Súvisiace recepty - [Query Store – konfigurácia a stav](script.php?id=46&s=query-store-konfiguracia-a-stav) - [Query Store – regresie](script.php?id=26&s=query-store-regresie-24-h-vs-predoslych-24-h)
Skript
Query Store – top dotazy podľa CPU
Najdrahšie dotazy podľa CPU za posledných N hodín z Query Store – aj tie, ktoré už vypadli z plan cache.
Parametre skriptu doplň a kopíruj hotový skript
/* DeadlockCafe | Query Store – top dotazy podľa CPU
Účel: Najdrahšie dotazy podľa CPU za posledných N hodín z Query Store – aj tie, ktoré už vypadli z plan cache.
Režim: READ ONLY | SQL Server 2016 – 2022, on-premises
*/
SET NOCOUNT ON;
-- Spusti v cieľovej databáze (Query Store je per databáza)
DECLARE @HoursBack int = {{HoursBack:1}};
;WITH totals AS
(
SELECT q.query_id, q.query_text_id,
SUM(rs.count_executions) AS executions,
SUM(CONVERT(float, rs.avg_cpu_time) * rs.count_executions) AS cpu_total_us,
SUM(CONVERT(float, rs.avg_duration) * rs.count_executions) AS duration_total_us,
SUM(CONVERT(float, rs.avg_logical_io_reads) * rs.count_executions) AS reads_total
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
JOIN sys.query_store_runtime_stats_interval AS i
ON i.runtime_stats_interval_id = rs.runtime_stats_interval_id
WHERE i.end_time > DATEADD(HOUR, -@HoursBack, SYSDATETIMEOFFSET())
AND rs.execution_type = 0
GROUP BY q.query_id, q.query_text_id
)
SELECT TOP (30)
t.query_id, t.executions,
CAST(t.cpu_total_us / 1000.0 AS decimal(20,1)) AS total_cpu_ms,
CAST(t.cpu_total_us / NULLIF(t.executions, 0) / 1000.0 AS decimal(18,2)) AS avg_cpu_ms,
CAST(t.duration_total_us / NULLIF(t.executions, 0) / 1000.0 AS decimal(18,2)) AS avg_duration_ms,
CAST(t.reads_total / NULLIF(t.executions, 0) AS decimal(18,1)) AS avg_logical_reads,
qt.query_sql_text
FROM totals AS t
JOIN sys.query_store_query_text AS qt ON qt.query_text_id = t.query_text_id
ORDER BY t.cpu_total_us DESC;