Preskočiť na obsah
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.

query-store-top-dotazy-podla-cpu.sql 36 riadkov · T-SQL
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;
## 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)