sys.dm_exec_query_profiles (Transact-SQL)
S’applique à : SQL ServerAzure SQL Database Azure SQL Managed Instance
Contrôle la progression en temps réel lorsqu'une requête est en cours d'exécution. Par exemple, utilisez cette vue de gestion dynamique pour déterminer la partie de la requête qui est lente. Joignez cette vue de gestion dynamique à d'autres vues de gestion dynamique système identifiées dans le champ de description. Ou bien, joignez cette vue de gestion dynamique à d'autres compteurs de performances (tels que l'analyseur de performances, xperf) à l'aide de colonnes timestamp.
Table retournée
Les compteurs retournés sont par opérateur par thread. Les résultats sont dynamiques et ne correspondent pas aux résultats des options existantes, telles que SET STATISTICS XML ON
celles qui créent uniquement la sortie lorsque la requête est terminée.
Nom de la colonne | Type de données | Description |
---|---|---|
session_id | smallint | Identifie la session dans laquelle cette requête s'exécute. Référence dm_exec_sessions.session_id. |
request_id | int | Identifie la demande cible. Référence dm_exec_sessions.request_id. |
sql_handle | varbinary(64) | Jeton identifiant de manière unique le traitement ou la procédure stockée dont fait partie la requête. Référence dm_exec_query_stats.sql_handle. |
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. Références dm_exec_query_stats.plan_handle. |
physical_operator_name | nvarchar (256) | Nom de l'opérateur physique. |
node_id | int | Identifie un nœud d'opérateur dans l'arborescence de requête. |
thread_id | int | Fait la distinction entre les threads (pour une requête parallèle) qui appartiennent au même nœud d'opérateur de requête. |
task_address | varbinary(8) | Identifie la tâche SQLOS utilisée par ce thread. Référence dm_os_tasks.task_address. |
row_count | bigint | Nombre de lignes retournées par l'opérateur jusqu'à présent. |
rewind_count | bigint | Nombre de rembobinages jusqu'à présent. |
rebind_count | bigint | Nombre de reliaisons jusqu'à présent. |
end_of_scan_count | bigint | Nombre de fins d'analyses jusqu'à présent. |
estimate_row_count | bigint | Nombre de lignes estimé. Il peut être utile pour comparer estimated_row_count à actual row_count réel. |
first_active_time | bigint | Heure du premier appel de l'opérateur en millisecondes. |
last_active_time | bigint | Heure du dernier appel de l'opérateur en millisecondes. |
open_time | bigint | Horodatage lors de l'ouverture (en millisecondes). |
first_row_time | bigint | Horodatage lors de l'ouverture de la première ligne (en millisecondes). |
last_row_time | bigint | Horodatage lors de l'ouverture de la dernière ligne (en millisecondes). |
close_time | bigint | Horodatage lors de la fermeture (en millisecondes). |
elapsed_time_ms | bigint | Temps écoulé total (en millisecondes) utilisé par les opérations du nœud cible jusqu’à présent. |
cpu_time_ms | bigint | Temps processeur total (en millisecondes) utilisé par les opérations du nœud cible jusqu’à présent. |
database_id | smallint | ID de la base de données qui contient l'objet sur lequel les opérations de lecture et d'écriture sont effectuées. |
object_id | int | Identificateur de l'objet sur lequel les opérations de lecture et écriture sont effectuées. Fait référence à sys.objects.object_id. |
index_id | int | Index (le cas échéant) dans lequel l'ensemble de lignes est ouvert. |
scan_count | bigint | Nombre d'analyses de tables ou d'index jusqu'à présent. |
logical_read_count | bigint | Nombre de lectures logiques jusqu'à présent. |
physical_read_count | bigint | Nombre de lectures physiques jusqu'à présent. |
read_ahead_count | bigint | Nombre de lectures anticipées jusqu'à présent. |
write_page_count | bigint | Nombre d'écritures de page jusqu'à présent en raison de débordement. |
lob_logical_read_count | bigint | Nombre de lectures logiques LOB jusqu'à présent. |
lob_physical_read_count | bigint | Nombre de lectures physiques LOB jusqu'à présent. |
lob_read_ahead_count | bigint | Nombre de lectures anticipées LOB jusqu'à présent. |
segment_read_count | int | Nombre de lectures anticipées de segment jusqu'à présent. |
segment_skip_count | int | Nombre de segments ignorés jusqu'à présent. |
actual_read_row_count | bigint | Nombre de lignes lues par un opérateur avant l’application du prédicat résiduel. |
estimated_read_row_count | bigint | S’applique à : à partir de SQL Server 2016 (13.x) SP1. Nombre de lignes estimées à lire par un opérateur avant l’application du prédicat résiduel. |
Remarques d'ordre général
Si le nœud du plan de requête n’a pas d’E/S, tous les compteurs liés aux E/S sont définis sur NULL.
Les compteurs liés aux E/S signalés par cette DMV sont plus granulaires que ceux signalés par SET STATISTICS IO
les deux manières suivantes :
SET STATISTICS IO
regroupe les compteurs pour toutes les E/S dans une table donnée. Avec cette DMV, vous obtiendrez des compteurs distincts pour chaque nœud du plan de requête qui effectue des E/S dans la table.En cas d'analyse parallèle, cette vue de gestion dynamique indique des compteurs pour chaque threads parallèles de l'analyse.
À compter de SQL Server 2016 (13.x) SP1, l’infrastructure de profilage des statistiques d’exécution des requêtes standard existe côte à côte avec une infrastructure de profilage des statistiques d’exécution de requêtes légère. SET STATISTICS XML ON
et SET STATISTICS PROFILE ON
utilisez toujours l’infrastructure de profilage des statistiques d’exécution de requête standard. Pour sys.dm_exec_query_profiles
qu’elles soient remplies, l’une des infrastructures de profilage des requêtes doit être activée. Pour plus d’informations, consultez Infrastructure du profilage de requête.
Remarque
La requête en cours d’examen doit démarrer une fois l’infrastructure de profilage de requête activée, l’activation après le démarrage de la requête ne produit pas de résultats sys.dm_exec_query_profiles
. Pour plus d’informations sur l’activation des infrastructures de profilage des requêtes, consultez Infrastructure de profilage des requêtes.
autorisations
- Sur SQL Server et Azure SQL Managed Instance, nécessite
VIEW DATABASE STATE
l’autorisation et l’appartenance audb_owner
rôle de base de données. - Sur les niveaux Premium Azure SQL Database, nécessite l’autorisation
VIEW DATABASE STATE
dans la base de données. - Sur les objectifs de service Azure SQL Database Basic, S0 et S1, et pour les bases de données dans des pools élastiques, le compte d’administrateur du serveur ou le compte d’administrateur Microsoft Entra est requis. Sur tous les autres objectifs de service SQL Database, l’autorisation
VIEW DATABASE STATE
est requise dans la base de données.
Autorisations pour SQL Server 2022 (et versions plus récentes)
Nécessite l’autorisation VIEW DATABASE PERFORMANCE STATE sur la base de données.
Exemples
Étape 1 : Connectez-vous à une session dans laquelle vous prévoyez d’exécuter la requête avec sys.dm_exec_query_profiles
laquelle vous allez analyser . Pour configurer la requête pour l’utilisation SET STATISTICS PROFILE ON
du profilage . Exécutez votre requête dans la même session.
--Configure query for profiling with sys.dm_exec_query_profiles
SET STATISTICS PROFILE ON;
GO
--Or enable query profiling globally under SQL Server 2016 SP1 or above (not needed in SQL Server 2019)
DBCC TRACEON (7412, -1);
GO
--Next, run your query in this session, or in any other session if query profiling has been enabled globally
Étape 2 : Connectez-vous à une deuxième session différente de la session dans laquelle votre requête est en cours d’exécution.
L'instruction suivante résume l'avancement de la requête en cours d'exécution dans la session 54. Pour ce faire, elle calcule le nombre total de lignes de sortie de tous les threads pour chaque nœud, et compare ce nombre au nombre estimé de lignes de sortie pour ce nœud.
--Run this in a different session than the session in which your query is running.
--Note that you may need to change session id 54 below with the session id you want to monitor.
SELECT node_id,physical_operator_name, SUM(row_count) row_count,
SUM(estimate_row_count) AS estimate_row_count,
CAST(SUM(row_count)*100 AS float)/SUM(estimate_row_count)
FROM sys.dm_exec_query_profiles
WHERE session_id=54
GROUP BY node_id,physical_operator_name
ORDER BY node_id;
Voir aussi
Fonctions et vues de gestion dynamique (Transact-SQL)
Fonctions et vues de gestion dynamique relatives à l'exécution (Transact-SQL)