sys.dm_exec_query_stats (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Retourne des statistiques de performances agrégées pour les plans de requête mis en cache dans SQL Server. La vue contient une ligne par instruction de requête dans le plan en cache et la durée de vie des lignes est liée au plan lui-même. Lorsqu'un plan est supprimé du cache, les lignes correspondantes sont éliminées de cette vue.

Remarque

  • Les résultats de sys.dm_exec_query_stats peuvent varier avec chaque exécution, car les données reflètent uniquement les requêtes terminées, et non celles en cours d’exécution.
  • Pour appeler cela à partir d’un pool SQL dédié dans Azure Synapse Analytics ou Analytics Platform System (PDW), utilisez le nom sys.dm_pdw_nodes_exec_query_stats. Pour le pool SQL serverless, utilisez sys.dm_exec_query_stats.
Nom de la colonne Type de données Description
sql_handle varbinary(64) Jeton identifiant de manière unique le traitement ou la procédure stockée dont fait partie la requête.

sql_handle, ainsi que statement_start_offset et statement_end_offset, peuvent être utilisés pour récupérer le texte SQL de la requête en appelant la fonction de gestion dynamique sys.dm_exec_sql_text.
statement_start_offset int Indique, en octets, la position de début (à partir de 0) de la requête que la ligne décrit dans le texte de son traitement ou de son objet persistant.
statement_end_offset int Indique, en octets, la position de fin (à partir de 0) de la requête que la ligne décrit dans le texte de son traitement ou de son objet persistant. Pour les versions antérieures à SQL Server 2014 (12.x), la valeur -1 indique la fin du lot. Les commentaires de fin ne sont plus inclus.
plan_generation_num bigint Numéro de séquence permettant de distinguer les instances de plans après une recompilation.
plan_handle varbinary(64) Est un jeton qui identifie de façon univoque un plan d'exécution de requête pour un lot exécuté ; ce plan réside dans la mémoire cache des plans ou est en cours d’exécution. Cette valeur peut être transmise à la fonction de gestion dynamique sys.dm_exec_query_plan pour obtenir le plan de requête.

Sa valeur est toujours 0x000 lorsqu'une procédure stockée compilée en mode natif interroge une table optimisée en mémoire.
creation_time datetime Heure de compilation du plan.
last_execution_time datetime Heure de début de la dernière exécution du plan.
execution_count bigint Nombre d'exécutions du plan depuis sa dernière compilation.
total_worker_time bigint Temps processeur total, indiqué en microsecondes (mais précis uniquement en millisecondes), utilisé par les exécutions de ce plan depuis sa compilation.

Pour les procédures stockées compilées en mode natif, total_worker_time peut être inexact si plusieurs exécutions sont réalisées en moins d’une milliseconde.
last_worker_time bigint Temps processeur, indiqué en microsecondes (mais précis uniquement en millisecondes), utilisé lors de la dernière exécution du plan. 1
min_worker_time bigint Temps processeur minimum, indiqué en microsecondes (mais précis uniquement en millisecondes), jamais utilisé par ce plan en une seule exécution. 1
max_worker_time bigint Temps processeur maximum, indiqué en microsecondes (mais précis uniquement en millisecondes), jamais utilisé par ce plan en une seule exécution. 1
total_physical_reads bigint Nombre total de lectures physiques effectuées par les exécutions de ce plan depuis sa compilation.

Sa valeur est toujours 0 lors de l'interrogation d'une table optimisée en mémoire.
last_physical_reads bigint Nombre de lectures physiques effectuées lors de la dernière exécution du plan.

Sa valeur est toujours 0 lors de l'interrogation d'une table optimisée en mémoire.
min_physical_reads bigint Nombre minimal de lectures physiques effectuées par ce plan lors d'une seule exécution.

Sa valeur est toujours 0 lors de l'interrogation d'une table optimisée en mémoire.
max_physical_reads bigint Nombre maximal de lectures physiques effectuées par ce plan lors d'une seule exécution.

Sa valeur est toujours 0 lors de l'interrogation d'une table optimisée en mémoire.
total_logical_writes bigint Nombre total d'écritures logiques effectuées par les exécutions de ce plan depuis sa compilation.

Sa valeur est toujours 0 lors de l'interrogation d'une table optimisée en mémoire.
last_logical_writes bigint Nombre de pages de pool de mémoires tampons endommagées lors de l’exécution la plus récente du plan.

Une fois qu’une page est lue, la page devient sale uniquement la première fois qu’elle est modifiée. Lorsqu’une page devient sale, ce nombre est incrémenté. Les modifications suivantes d’une page déjà sale n’affectent pas ce nombre.

Ce nombre sera toujours 0 lors de l’interrogation d’une table optimisée en mémoire.
min_logical_writes bigint Nombre minimal d'écritures logiques effectuées par ce plan lors d'une seule exécution.

Sa valeur est toujours 0 lors de l'interrogation d'une table optimisée en mémoire.
max_logical_writes bigint Nombre maximal d'écritures logiques effectuées par ce plan lors d'une seule exécution.

Sa valeur est toujours 0 lors de l'interrogation d'une table optimisée en mémoire.
total_logical_reads bigint Nombre total de lectures logiques effectuées par les exécutions de ce plan depuis sa compilation.

Sa valeur est toujours 0 lors de l'interrogation d'une table optimisée en mémoire.
last_logical_reads bigint Nombre de lectures logiques effectuées lors de la dernière exécution du plan.

Sa valeur est toujours 0 lors de l'interrogation d'une table optimisée en mémoire.
min_logical_reads bigint Nombre minimal de lectures logiques effectuées par ce plan lors d'une seule exécution.

Sa valeur est toujours 0 lors de l'interrogation d'une table optimisée en mémoire.
max_logical_reads bigint Nombre maximal de lectures logiques effectuées par ce plan lors d'une seule exécution.

Sa valeur est toujours 0 lors de l'interrogation d'une table optimisée en mémoire.
total_clr_time bigint Heure, signalée en microsecondes (mais exactes à millisecondes), consommées à l’intérieur des objets CLR (Common Language Runtime) microsoft .NET Framework par exécutions de ce plan depuis sa compilation. Les objets CLR peuvent être des procédures stockées, des fonctions, des déclencheurs, des types et des agrégats.
last_clr_time bigint Temps, signalé en microsecondes (mais uniquement précis en millisecondes) consommés par l’exécution à l’intérieur d’objets CLR .NET Framework pendant la dernière exécution de ce plan. Les objets CLR peuvent être des procédures stockées, des fonctions, des déclencheurs, des types et des agrégats.
min_clr_time bigint Durée minimale, signalée en microsecondes (mais exacte à millisecondes seulement), que ce plan a jamais consommé à l’intérieur des objets CLR .NET Framework pendant une seule exécution. Les objets CLR peuvent être des procédures stockées, des fonctions, des déclencheurs, des types et des agrégats.
max_clr_time bigint Durée maximale, signalée en microsecondes (mais exacte à millisecondes seulement), que ce plan a jamais consommé à l’intérieur du CLR .NET Framework pendant une seule exécution. Les objets CLR peuvent être des procédures stockées, des fonctions, des déclencheurs, des types et des agrégats.
total_elapsed_time bigint Temps total écoulé, indiqué en microsecondes (mais précis uniquement en millisecondes), pour les exécutions de ce plan.
last_elapsed_time bigint Temps écoulé, indiqué en microsecondes (mais précis uniquement en millisecondes), pour la dernière exécution de ce plan.
min_elapsed_time bigint Temps minimum écoulé, indiqué en microsecondes (mais précis uniquement en millisecondes), pour les différentes exécutions de ce plan.
max_elapsed_time bigint Temps maximum écoulé, indiqué en microsecondes (mais précis uniquement en millisecondes), pour les différentes exécutions de ce plan.
query_hash Binary(8) La valeur de hachage binaire calculée sur la requête et utilisée pour identifier des requêtes avec une logique similaire. Vous pouvez utiliser le hachage de requête pour déterminer l'utilisation des ressources globale pour les requêtes qui diffèrent uniquement par les valeurs littérales.
query_plan_hash binary(8) Valeur de hachage binaire calculée sur le plan d'exécution de requête et utilisée pour identifier des plans d'exécution de requête semblables. Vous pouvez utiliser le hachage de plan de requête pour rechercher le coût cumulatif de requêtes avec les plans d'exécution semblables.

Sa valeur est toujours 0x000 lorsqu'une procédure stockée compilée en mode natif interroge une table optimisée en mémoire.
total_rows bigint Nombre total de lignes renvoyées par la requête. Ne peut pas avoir la valeur null.

Sa valeur est toujours 0 lorsqu'une procédure stockée compilée en mode natif interroge une table optimisée en mémoire.
last_rows bigint Nombre de lignes renvoyées par la dernière exécution de la requête. Ne peut pas avoir la valeur null.

Sa valeur est toujours 0 lorsqu'une procédure stockée compilée en mode natif interroge une table optimisée en mémoire.
min_rows bigint Nombre minimal de lignes jamais retournées par la requête pendant une exécution. Ne peut pas avoir la valeur null.

Sa valeur est toujours 0 lorsqu'une procédure stockée compilée en mode natif interroge une table optimisée en mémoire.
max_rows bigint Nombre maximal de lignes jamais retournées par la requête pendant une exécution. Ne peut pas avoir la valeur null.

Sa valeur est toujours 0 lorsqu'une procédure stockée compilée en mode natif interroge une table optimisée en mémoire.
statement_sql_handle varbinary(64) S’applique à : SQL Server 2014 (12.x) et versions ultérieures.

Renseigné avec des valeurs non NULL uniquement si Magasin des requêtes est activé et collecte des statistiques pour cette requête particulière.
statement_context_id bigint S’applique à : SQL Server 2014 (12.x) et versions ultérieures.

Renseigné avec des valeurs non NULL uniquement si Magasin des requêtes est activé et collecte des statistiques pour cette requête particulière.
total_dop bigint Somme totale du degré de parallélisme utilisé par ce plan depuis sa compilation. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
last_dop bigint Degré de parallélisme lorsque ce plan a exécuté la dernière fois. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
min_dop bigint Degré minimal de parallélisme que ce plan n’a jamais utilisé pendant une exécution. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
max_dop bigint Degré maximal de parallélisme que ce plan n’a jamais utilisé pendant une exécution. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
total_grant_kb bigint Quantité totale d’allocation de mémoire réservée dans Ko ce plan a été reçu depuis sa compilation. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
last_grant_kb bigint Quantité d’allocation de mémoire réservée dans Ko lors de l’exécution de ce plan la dernière fois. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
min_grant_kb bigint Quantité minimale d’allocation de mémoire réservée dans Ko ce plan n’a jamais été reçu pendant une exécution. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
max_grant_kb bigint Quantité maximale d’allocation de mémoire réservée dans Ko ce plan n’a jamais été reçu pendant une exécution. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
total_used_grant_kb bigint Quantité totale d’allocation de mémoire réservée dans Ko ce plan utilisé depuis sa compilation. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
last_used_grant_kb bigint Quantité d’allocation de mémoire utilisée dans Ko lors de l’exécution de ce plan la dernière fois. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
min_used_grant_kb bigint Quantité minimale d’allocation de mémoire utilisée dans Ko ce plan jamais utilisé pendant une exécution. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
max_used_grant_kb bigint Quantité maximale d’allocation de mémoire utilisée dans Ko ce plan jamais utilisé pendant une exécution. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
total_ideal_grant_kb bigint Quantité totale d’allocation de mémoire idéale dans Ko ce plan estimé depuis sa compilation. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
last_ideal_grant_kb bigint Quantité d’allocation de mémoire idéale dans Ko lorsque ce plan a exécuté la dernière fois. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
min_ideal_grant_kb bigint Quantité minimale d’allocation de mémoire idéale dans Ko ce plan jamais estimé pendant une exécution. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
max_ideal_grant_kb bigint Quantité maximale d’allocation de mémoire idéale dans Ko ce plan jamais estimé pendant une exécution. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
total_reserved_threads bigint Somme totale des threads parallèles réservés que ce plan n’a jamais utilisé depuis sa compilation. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
last_reserved_threads bigint Nombre de threads parallèles réservés lorsque ce plan a exécuté la dernière fois. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
min_reserved_threads bigint Nombre minimal de threads parallèles réservés que ce plan n’a jamais utilisé pendant une exécution. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
max_reserved_threads bigint Nombre maximal de threads parallèles réservés que ce plan n’a jamais utilisé pendant une exécution. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
total_used_threads bigint Somme totale des threads parallèles utilisés que ce plan n’a jamais utilisé depuis sa compilation. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
last_used_threads bigint Nombre de threads parallèles utilisés lorsque ce plan a exécuté la dernière fois. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
min_used_threads bigint Nombre minimal de threads parallèles utilisés que ce plan n’a jamais utilisé pendant une exécution. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
max_used_threads bigint Nombre maximal de threads parallèles utilisés que ce plan n’a jamais utilisé pendant une exécution. Il sera toujours 0 pour interroger une table optimisée en mémoire.

S’applique à : SQL Server 2016 (13.x) et versions ultérieures.
total_columnstore_segment_reads bigint Somme totale des segments columnstore lus par la requête. Ne peut pas avoir la valeur null.

S’applique à : à partir de SQL Server 2016 (13.x) SP2 et SQL Server 2017 (14.x) CU3
last_columnstore_segment_reads bigint Nombre de segments columnstore lus par la dernière exécution de la requête. Ne peut pas avoir la valeur null.

S’applique à : à partir de SQL Server 2016 (13.x) SP2 et SQL Server 2017 (14.x) CU3
min_columnstore_segment_reads bigint Nombre minimal de segments columnstore jamais lus par la requête pendant une exécution. Ne peut pas avoir la valeur null.

S’applique à : à partir de SQL Server 2016 (13.x) SP2 et SQL Server 2017 (14.x) CU3
max_columnstore_segment_reads bigint Nombre maximal de segments columnstore jamais lus par la requête pendant une exécution. Ne peut pas avoir la valeur null.

S’applique à : à partir de SQL Server 2016 (13.x) SP2 et SQL Server 2017 (14.x) CU3
total_columnstore_segment_skips bigint Somme totale des segments columnstore ignorés par la requête. Ne peut pas avoir la valeur null.

S’applique à : à partir de SQL Server 2016 (13.x) SP2 et SQL Server 2017 (14.x) CU3
last_columnstore_segment_skips bigint Nombre de segments columnstore ignorés par la dernière exécution de la requête. Ne peut pas avoir la valeur null.

S’applique à : à partir de SQL Server 2016 (13.x) SP2 et SQL Server 2017 (14.x) CU3
min_columnstore_segment_skips bigint Nombre minimal de segments columnstore jamais ignorés par la requête pendant une exécution. Ne peut pas avoir la valeur null.

S’applique à : à partir de SQL Server 2016 (13.x) SP2 et SQL Server 2017 (14.x) CU3
max_columnstore_segment_skips bigint Nombre maximal de segments columnstore jamais ignorés par la requête pendant une exécution. Ne peut pas avoir la valeur null.

S’applique à : à partir de SQL Server 2016 (13.x) SP2 et SQL Server 2017 (14.x) CU3
total_spills bigint Nombre total de pages débordées par l’exécution de cette requête depuis sa compilation.

S’applique à : à partir de SQL Server 2016 (13.x) SP2 et SQL Server 2017 (14.x) CU3
last_spills bigint Le nombre de pages a déversé la dernière fois que la requête a été exécutée.

S’applique à : à partir de SQL Server 2016 (13.x) SP2 et SQL Server 2017 (14.x) CU3
min_spills bigint Nombre minimal de pages que cette requête a jamais déversées pendant une seule exécution.

S’applique à : à partir de SQL Server 2016 (13.x) SP2 et SQL Server 2017 (14.x) CU3
max_spills bigint Nombre maximal de pages que cette requête a jamais déversées pendant une seule exécution.

S’applique à : à partir de SQL Server 2016 (13.x) SP2 et SQL Server 2017 (14.x) CU3
pdw_node_id int Identificateur du nœud sur lequel cette distribution est activée.

S’applique à : Azure Synapse Analytics, Analytics Platform System (PDW)
total_page_server_reads bigint Nombre total de lectures de serveur de pages distantes effectuées par les exécutions de ce plan depuis sa compilation.

S’applique à : Azure SQL Database Hyperscale
last_page_server_reads bigint Nombre de lectures de serveur de pages distantes effectuées la dernière fois que le plan a été exécuté.

S’applique à : Azure SQL Database Hyperscale
min_page_server_reads bigint Le nombre minimal de serveurs de pages distantes lit que ce plan n’a jamais effectué pendant une seule exécution.

S’applique à : Azure SQL Database Hyperscale
max_page_server_reads bigint Nombre maximal de lectures de serveur de pages distantes que ce plan a jamais effectuées pendant une seule exécution.

S’applique à : Azure SQL Database Hyperscale

Remarque

1 Pour les procédures stockées compilées en mode natif lorsque la collecte de statistiques est activée, le temps de travail est collecté en millisecondes. Si la requête s’exécute en moins d’une milliseconde, la valeur est 0.

Autorisations

Sur SQL Server et SQL Managed Instance, l’autorisation VIEW SERVER STATE est requise.

Sur les objectifs de service SQL Database Basic, S0 et S1, et pour les bases de données dans des pools élastiques, le compte d’administrateur du serveur, le compte d’administrateur Microsoft Entra ou l’appartenance au ##MS_ServerStateReader##rôle serveur est requis. Sur tous les autres objectifs de service SQL Database, l’autorisation VIEW DATABASE STATE sur la base de données ou l’appartenance au rôle serveur ##MS_ServerStateReader## est requise.

Autorisations pour SQL Server 2022 (et versions plus récentes)

Nécessite l’autorisation VIEW SERVER PERFORMANCE STATE sur le serveur.

Notes

Les statistiques de la vue sont actualisées lorsqu'une requête est terminée.

Exemples

R. Recherche des N premières requêtes (TOP N)

L’exemple suivant renvoie des informations relatives aux cinq premières requêtes, classées sur la base du temps processeur moyen. Cet exemple regroupe les requêtes d'après leur hachage de requête afin que les requêtes logiquement équivalentes soient groupées par leur consommation de ressources cumulative. La colonne Sample_Statement_Text montre un exemple de structure de requête qui correspond au hachage de requête, mais il doit être lu sans tenir compte des valeurs spécifiques de l’instruction. Par exemple, si une instruction contient WHERE Id = 5, vous pouvez la lire sous sa forme plus générique : 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. Retour des agrégats de nombre de lignes à une requête

L'exemple suivant retourne les informations d'agrégation du nombre de lignes (nombre total de lignes, nombre minimal de lignes, nombre maximal de lignes et dernières lignes) pour les requêtes.

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;  

Voir aussi

Fonctions et vues de gestion dynamique relatives à l'exécution (Transact-SQL)
sys.dm_exec_sql_text (Transact-SQL)
sys.dm_exec_query_plan (Transact-SQL)
sys.dm_exec_procedure_stats (Transact-SQL)
sys.dm_exec_trigger_stats (Transact-SQL)
sys.dm_exec_cached_plans (Transact-SQL)