Condividi tramite


sys.dm_exec_query_stats (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di Azure

Restituisce statistiche sulle prestazioni aggregate per i piani di query memorizzati nella cache in SQL Server. La vista contiene una riga per ogni istruzione di query nel piano memorizzato nella cache e la durata delle righe è legata al piano stesso. Quando un piano viene rimosso dalla cache, le righe corrispondenti vengono eliminate da questa vista.

I risultati di sys.dm_exec_query_stats possono variare con ogni esecuzione perché i dati riflettono solo le query completate e non quelle ancora in anteprima.

Per chiamare questa DMV da un pool SQL dedicato in Azure Synapse Analytics o nel sistema della piattaforma di analisi (PDW), usare il nome sys.dm_pdw_nodes_exec_query_stats. Per il pool SQL serverless, usare sys.dm_exec_query_stats.

Nome colonna Tipo di dati Descrizione
sql_handle varbinary(64) Token che identifica in modo univoco il batch o la stored procedure di cui fa parte la query.

sql_handle, insieme a statement_start_offset e statement_end_offset, può essere usato per recuperare il testo SQL della query chiamando la funzione di gestione dinamica sys.dm_exec_sql_text.
statement_start_offset int Indica, in byte e a partire da 0, la posizione iniziale della query descritta dalla riga all'interno del testo del batch o dell'oggetto persistente.
statement_end_offset int Indica, in byte e a partire da 0, la posizione finale della query descritta dalla riga all'interno del testo del batch o dell'oggetto persistente. Per le versioni precedenti a SQL Server 2014 (12.x), il valore -1 indica la fine del batch. I commenti finali non sono più inclusi.
plan_generation_num bigint Numero di sequenza utilizzabile per distinguere le istanze dei piani dopo una ricompilazione.
plan_handle varbinary(64) Token che identifica in modo univoco un piano di esecuzione di query per un batch eseguito e il relativo piano risiede nella cache dei piani o è attualmente in esecuzione. Questo valore può essere passato alla funzione di gestione dinamica sys.dm_exec_query_plan per ottenere il piano di query.

Sempre 0x000 quando una stored procedure compilata in modo nativo esegue query su una tabella ottimizzata per la memoria.
creation_time datetime Ora di compilazione del piano. L'ora viene registrata nel fuso orario corrente .
last_execution_time datetime Ora dell'ultimo avvio dell'esecuzione del piano. L'ora viene registrata nel fuso orario corrente .
execution_count bigint Numero di esecuzioni del piano a partire dall'ultima compilazione.
total_worker_time bigint Quantità totale di tempo di CPU, espresso in microsecondi (con precisione al millisecondo), impiegato per le esecuzioni del piano a partire dalla relativa compilazione.

Per le stored procedure compilate in modo nativo, total_worker_time potrebbe non essere accurato se molte esecuzioni richiedono meno di 1 millisecondo.
last_worker_time bigint Tempo di CPU, espresso in microsecondi (con precisione al millisecondo), impiegato per l'ultima esecuzione del piano. 1
min_worker_time bigint Tempo minimo di CPU, espresso in microsecondi (con precisione al millisecondo), mai impiegato dal piano durante una singola esecuzione. 1
max_worker_time bigint Tempo massimo di CPU, espresso in microsecondi (con precisione al millisecondo), mai impiegato dal piano durante una singola esecuzione. 1
total_physical_reads bigint Numero totale di letture fisiche effettuate dalle esecuzioni del piano a partire dalla relativa compilazione.

Sempre 0 durante l'esecuzione di query su una tabella ottimizzata per la memoria.
last_physical_reads bigint Numero di letture fisiche eseguite durante l'ultima esecuzione del piano.

Sempre 0 durante l'esecuzione di query su una tabella ottimizzata per la memoria.
min_physical_reads bigint Numero minimo di letture fisiche effettuate dal piano durante una singola esecuzione.

Sempre 0 durante l'esecuzione di query su una tabella ottimizzata per la memoria.
max_physical_reads bigint Numero massimo di letture fisiche effettuate dal piano durante una singola esecuzione.

Sempre 0 durante l'esecuzione di query su una tabella ottimizzata per la memoria.
total_logical_writes bigint Numero totale di scritture logiche effettuate dalle esecuzioni del piano a partire dalla relativa compilazione.

Sempre 0 durante l'esecuzione di query su una tabella ottimizzata per la memoria.
last_logical_writes bigint Numero di pagine del pool di buffer interrotte durante l'esecuzione completata più di recente del piano.

Dopo la lettura di una pagina, la pagina diventa dirty solo la prima volta che viene modificata. Quando una pagina diventa dirty, questo numero viene incrementato. Le modifiche successive di una pagina già dirty non influiscono su questo numero.
Questo numero 0 sempre durante l'esecuzione di query su una tabella ottimizzata per la memoria.
min_logical_writes bigint Numero minimo di scritture logiche effettuate dal piano durante una singola esecuzione.

Sempre 0 durante l'esecuzione di query su una tabella ottimizzata per la memoria.
max_logical_writes bigint Numero massimo di scritture logiche effettuate dal piano durante una singola esecuzione.

Sempre 0 durante l'esecuzione di query su una tabella ottimizzata per la memoria.
total_logical_reads bigint Numero totale di letture logiche effettuate dalle esecuzioni del piano a partire dalla sua compilazione.

Sempre 0 durante l'esecuzione di query su una tabella ottimizzata per la memoria.
last_logical_reads bigint Numero di letture logiche effettuate durante l'ultima esecuzione del piano.

Sempre 0 durante l'esecuzione di query su una tabella ottimizzata per la memoria.
min_logical_reads bigint Numero minimo di letture logiche effettuate dal piano durante una singola esecuzione.

Sempre 0 durante l'esecuzione di query su una tabella ottimizzata per la memoria.
max_logical_reads bigint Numero massimo di letture logiche effettuate dal piano durante una singola esecuzione.

Sempre 0 durante l'esecuzione di query su una tabella ottimizzata per la memoria.
total_clr_time bigint Tempo, segnalato in microsecondi (ma solo accurato in millisecondi), utilizzato all'interno di oggetti ClR (Common Language Runtime) di Microsoft .NET Framework da esecuzioni di questo piano dopo la compilazione. Gli oggetti CLR possono essere stored procedure, funzioni, trigger, tipi e aggregazioni.
last_clr_time bigint Tempo, segnalato in microsecondi (ma solo accurato in millisecondi) utilizzato dall'esecuzione all'interno di oggetti CLR di .NET Framework durante l'ultima esecuzione di questo piano. Gli oggetti CLR possono essere stored procedure, funzioni, trigger, tipi e aggregazioni.
min_clr_time bigint Tempo minimo, segnalato in microsecondi (ma solo accurato in millisecondi), che questo piano ha mai utilizzato all'interno di oggetti CLR di .NET Framework durante una singola esecuzione. Gli oggetti CLR possono essere stored procedure, funzioni, trigger, tipi e aggregazioni.
max_clr_time bigint Tempo massimo, segnalato in microsecondi (ma solo accurato in millisecondi), che questo piano ha mai utilizzato all'interno di CLR di .NET Framework durante una singola esecuzione. Gli oggetti CLR possono essere stored procedure, funzioni, trigger, tipi e aggregazioni.
total_elapsed_time bigint Tempo totale trascorso, espresso in microsecondi (con precisione al millisecondo), per le esecuzioni completate di questo piano.
last_elapsed_time bigint Tempo trascorso, espresso in microsecondi (con precisione al millisecondo), per le ultime esecuzioni completate di questo piano.
min_elapsed_time bigint Tempo minimo trascorso, espresso in microsecondi (con precisione al millisecondo), per un'esecuzione completata di questo piano.
max_elapsed_time bigint Tempo massimo trascorso, espresso in microsecondi (con precisione al millisecondo), per un'esecuzione completata di questo piano.
query_hash Binary(8) Valore hash binario calcolato sulla query che consente di identificare query con logica analoga. È possibile utilizzare il valore hash della query per determinare l'utilizzo delle risorse aggregate per query che differiscono solo per valori letterali.
query_plan_hash binary(8) Valore hash binario calcolato sul piano di esecuzione di query che consente di identificare piani di esecuzioni analoghi. È possibile utilizzare il valore hash del piano di query per individuare il costo cumulativo di query con piani di esecuzione analoghi.

Sempre 0x000 quando una stored procedure compilata in modo nativo esegue query su una tabella ottimizzata per la memoria.
total_rows bigint Numero totale di righe restituite dalla query. Non può essere null.

Sempre 0 quando una stored procedure compilata in modo nativo esegue query su una tabella ottimizzata per la memoria.
last_rows bigint Numero di righe restituite durante l'ultima esecuzione della query. Non può essere null.

Sempre 0 quando una stored procedure compilata in modo nativo esegue query su una tabella ottimizzata per la memoria.
min_rows bigint Numero minimo di righe restituite dalla query durante un'esecuzione. Non può essere null.

Sempre 0 quando una stored procedure compilata in modo nativo esegue query su una tabella ottimizzata per la memoria.
max_rows bigint Numero massimo di righe restituite dalla query durante un'esecuzione. Non può essere null.

Sempre 0 quando una stored procedure compilata in modo nativo esegue query su una tabella ottimizzata per la memoria.
statement_sql_handle varbinary(64) si applica a: SQL Server 2014 (12.x) e versioni successive.

Popolato con valori non NULL solo se Query Store è attivato e raccoglie le statistiche per tale query specifica.
statement_context_id bigint si applica a: SQL Server 2014 (12.x) e versioni successive.

Popolato con valori non NULL solo se Query Store è attivato e raccoglie le statistiche per tale query specifica.
total_dop bigint Somma totale del grado di parallelismo usato da questo piano dopo la compilazione. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
last_dop bigint Grado di parallelismo quando questo piano è stato eseguito l'ultima volta. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
min_dop bigint Grado minimo di parallelismo usato da questo piano durante un'esecuzione. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
max_dop bigint Il grado massimo di parallelismo di questo piano mai usato durante un'esecuzione. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
total_grant_kb bigint Quantità totale di concessioni di memoria riservate in KB ricevuti dal momento della compilazione. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
last_grant_kb bigint Quantità di concessione di memoria riservata in KB quando questo piano è stato eseguito l'ultima volta. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
min_grant_kb bigint Quantità minima di concessione di memoria riservata in KB che questo piano ha mai ricevuto durante un'esecuzione. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
max_grant_kb bigint Quantità massima di concessioni di memoria riservate in KB che questo piano ha mai ricevuto durante un'esecuzione. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
total_used_grant_kb bigint Quantità totale di concessioni di memoria riservate in KB usato da quando è stata compilata. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
last_used_grant_kb bigint Quantità di concessione di memoria usata in KB quando questo piano è stato eseguito l'ultima volta. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
min_used_grant_kb bigint Quantità minima di concessione di memoria usata in KB questo piano mai usato durante un'esecuzione. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
max_used_grant_kb bigint Quantità massima di concessioni di memoria usate in KB che questo piano ha mai usato durante un'esecuzione. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
total_ideal_grant_kb bigint Quantità totale di concessioni di memoria ideali in KB stimate dal momento della compilazione. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
last_ideal_grant_kb bigint Quantità di concessioni di memoria ideali in KB quando questo piano è stato eseguito l'ultima volta. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
min_ideal_grant_kb bigint Quantità minima di concessione di memoria ideale in KB che questo piano abbia mai stimato durante un'esecuzione. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
max_ideal_grant_kb bigint Quantità massima di concessioni di memoria ideali in KB che questo piano abbia mai stimato durante un'esecuzione. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
total_reserved_threads bigint Somma totale di thread paralleli riservati mai usati da quando è stata compilata. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
last_reserved_threads bigint Numero di thread paralleli riservati quando il piano è stato eseguito l'ultima volta. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
min_reserved_threads bigint Numero minimo di thread paralleli riservati mai usati durante un'esecuzione. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
max_reserved_threads bigint Numero massimo di thread paralleli riservati mai usati durante un'esecuzione. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
total_used_threads bigint Somma totale di thread paralleli usati in questo piano da quando è stata compilata. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
last_used_threads bigint Numero di thread paralleli usati quando questo piano è stato eseguito l'ultima volta. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
min_used_threads bigint Numero minimo di thread paralleli usati mai usati durante un'esecuzione. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
max_used_threads bigint Numero massimo di thread paralleli usati mai usati durante un'esecuzione. Sempre 0 per l'esecuzione di query su una tabella ottimizzata per la memoria.

si applica a: SQL Server 2016 (13.x) e versioni successive.
total_columnstore_segment_reads bigint Somma totale dei segmenti columnstore letti dalla query. Non può essere null.

Si applica a: a partire da SQL Server 2016 (13.x) SP2 e SQL Server 2017 (14.x) CU3
last_columnstore_segment_reads bigint Numero di segmenti columnstore letti dall'ultima esecuzione della query. Non può essere null.

Si applica a: a partire da SQL Server 2016 (13.x) SP2 e SQL Server 2017 (14.x) CU3
min_columnstore_segment_reads bigint Numero minimo di segmenti columnstore mai letti dalla query durante un'esecuzione. Non può essere null.

Si applica a: a partire da SQL Server 2016 (13.x) SP2 e SQL Server 2017 (14.x) CU3
max_columnstore_segment_reads bigint Numero massimo di segmenti columnstore mai letti dalla query durante un'esecuzione. Non può essere null.

Si applica a: a partire da SQL Server 2016 (13.x) SP2 e SQL Server 2017 (14.x) CU3
total_columnstore_segment_skips bigint Somma totale dei segmenti columnstore ignorati dalla query. Non può essere null.

Si applica a: a partire da SQL Server 2016 (13.x) SP2 e SQL Server 2017 (14.x) CU3
last_columnstore_segment_skips bigint Numero di segmenti columnstore ignorati dall'ultima esecuzione della query. Non può essere null.

Si applica a: a partire da SQL Server 2016 (13.x) SP2 e SQL Server 2017 (14.x) CU3
min_columnstore_segment_skips bigint Numero minimo di segmenti columnstore mai ignorati dalla query durante un'esecuzione. Non può essere null.

Si applica a: a partire da SQL Server 2016 (13.x) SP2 e SQL Server 2017 (14.x) CU3
max_columnstore_segment_skips bigint Numero massimo di segmenti columnstore mai ignorati dalla query durante un'esecuzione. Non può essere null.

Si applica a: a partire da SQL Server 2016 (13.x) SP2 e SQL Server 2017 (14.x) CU3
total_spills bigint Numero totale di pagine distribuite dall'esecuzione di questa query dopo la compilazione.

Si applica a: a partire da SQL Server 2016 (13.x) SP2 e SQL Server 2017 (14.x) CU3
last_spills bigint Numero di pagine distribuite l'ultima volta che è stata eseguita la query.

Si applica a: a partire da SQL Server 2016 (13.x) SP2 e SQL Server 2017 (14.x) CU3
min_spills bigint Numero minimo di pagine che la query ha mai s spillato durante una singola esecuzione.

Si applica a: a partire da SQL Server 2016 (13.x) SP2 e SQL Server 2017 (14.x) CU3
max_spills bigint Numero massimo di pagine che la query ha mai s spillato durante una singola esecuzione.

Si applica a: a partire da SQL Server 2016 (13.x) SP2 e SQL Server 2017 (14.x) CU3
pdw_node_id int Identificatore del nodo in cui è attiva la distribuzione.

Si applica a: Azure Synapse Analytics, Piattaforma di analisi (PDW)
total_page_server_reads bigint Numero totale di letture remote del server di pagine eseguite dalle esecuzioni di questo piano dopo la compilazione.

Si applica a: database SQL di Azure Hyperscale
last_page_server_reads bigint Numero di letture remote del server di pagine eseguite l'ultima volta che è stato eseguito il piano.

Si applica a: database SQL di Azure Hyperscale
min_page_server_reads bigint Il numero minimo di server di pagine remote legge che questo piano ha mai eseguito durante una singola esecuzione.

Si applica a: database SQL di Azure Hyperscale
max_page_server_reads bigint Il numero massimo di server di pagine remote legge che il piano ha mai eseguito durante una singola esecuzione.

Si applica a: database SQL di Azure Hyperscale

Nota

1 Per le stored procedure compilate in modo nativo quando la raccolta di statistiche è abilitata, il tempo di lavoro viene raccolto in millisecondi. Se la query viene eseguita in meno di un millisecondo, il valore è 0.

Autorizzazioni

SQL Server 2019 (15.x) e versioni precedenti e Istanza gestita di SQL di Azure richiedono VIEW SERVER STATE autorizzazione.

SQL Server 2022 (16.x) e versioni successive richiedono VIEW SERVER PERFORMANCE STATE'autorizzazione per il server.

In Database SQL di Azure Basic, S0e S1 obiettivi di servizio e per i database nei pool elastici , è necessario l'account amministratore del server , l'account amministratore di Microsoft Entra o l'appartenenza al ruolo del server . Per tutti gli altri obiettivi di servizio database SQL, è necessaria l'autorizzazione VIEW DATABASE STATE per il database o l'adesione ruolo del server ##MS_ServerStateReader##.

Osservazioni:

Le statistiche nella vista vengono aggiornate quando viene completata una query.

Esempi

R. Trovare le query TOP N

Nell'esempio seguente vengono restituite informazioni sulle prime cinque query classificate in base al tempo medio della CPU. Nell'esempio le query vengono aggregate in base al relativo valore hash del piano, in modo da raggruppare le query logicamente equivalenti in base all'utilizzo di risorse cumulativo. La colonna Sample_Statement_Text mostra un esempio della struttura di query che corrisponde all'hash della query, ma deve essere letta senza considerare valori specifici nell'istruzione . Ad esempio, se un'istruzione contiene WHERE Id = 5, è possibile leggerla nel formato più generico: WHERE Id = @some_value.

SELECT TOP 5
    query_stats.query_hash AS Query_Hash,
    SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS Avg_CPU_Time,
    MIN(query_stats.statement_text) AS Sample_Statement_Text
FROM (
    SELECT QS.*,
        SUBSTRING(ST.text, (QS.statement_start_offset / 2) + 1, (
                (
                    CASE statement_end_offset
                        WHEN - 1
                            THEN DATALENGTH(ST.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 ST
    ) AS query_stats
GROUP BY query_stats.query_hash
ORDER BY 2 DESC;

B. Restituire le aggregazioni di conteggio delle righe per una query

Nell'esempio seguente vengono restituite informazioni di aggregazione sul conteggio delle righe (righe totali, righe minime, righe massime e ultime righe) per le query.

SELECT qs.execution_count,
    SUBSTRING(qt.text, qs.statement_start_offset / 2 + 1, (
            CASE 
                WHEN qs.statement_end_offset = - 1
                    THEN LEN(CONVERT(NVARCHAR(max), qt.text)) * 2
                ELSE qs.statement_end_offset
                END - qs.statement_start_offset
            ) / 2) AS query_text,
    qt.dbid,
    dbname = DB_NAME(qt.dbid),
    qt.objectid,
    qs.total_rows,
    qs.last_rows,
    qs.min_rows,
    qs.max_rows
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE qt.text LIKE '%SELECT%'
ORDER BY qs.execution_count DESC;