sys.dm_db_tuning_recommendations (Transact-SQL)
S’applique à : SQL Server 2017 (14.x) et versions ultérieures Azure SQL Database Azure SQL Managed Instance
Retourne des informations détaillées sur les recommandations de réglage automatique. Pour plus d’informations, consultez Réglage automatique
Pour plus d’informations, consultez Supervision et réglage des performances dans Azure SQL Database et Azure SQL Managed Instance.
Dans Azure SQL Database, les vues de gestion dynamique ne peuvent pas exposer d’informations qui affecteraient l’autonomie de la base de données ou exposeraient des informations sur d’autres bases de données auxquelles l’utilisateur a accès. Pour éviter d’exposer ces informations, chaque ligne qui contient des données qui n’appartiennent pas au locataire connecté est filtrée.
Nom de la colonne | Type de données | Description |
---|---|---|
nom | nvarchar(4000) | Nom unique de recommandation. |
type | nvarchar(4000) | Nom de l’option de réglage automatique qui a produit la recommandation, par exemple, FORCE_LAST_GOOD_PLAN |
raison | nvarchar(4000) | Raison pour laquelle cette recommandation a été fournie. |
valid_since | datetime2 | La première fois que cette recommandation a été générée. |
last_refresh | datetime2 | La dernière fois que cette recommandation a été générée. |
state | nvarchar(4000) | Document JSON qui décrit l’état de la recommandation. Les champs suivants sont disponibles : - currentValue - État actuel de la recommandation.- reason - constante qui décrit pourquoi la recommandation est dans l’état actuel. |
is_executable_action | bit | 1 = La recommandation peut être exécutée sur la base de données via un script Transact-SQL. 0 = La recommandation ne peut pas être exécutée sur la base de données (par exemple : informations uniquement ou recommandation rétablie) |
is_revertable_action | bit | 1 = La recommandation peut être automatiquement surveillée et rétablie par le moteur de base de données. 0 = La recommandation ne peut pas être automatiquement surveillée et rétablie. La plupart des actions exécutables seront rétablies. |
execute_action_start_time | datetime2 | Date à laquelle la recommandation est appliquée. |
execute_action_duration | time | Durée de l’action d’exécution. |
execute_action_initiated_by | nvarchar(4000) | User = Plan forcé manuellement par l’utilisateur dans la recommandation.System = Recommandation appliquée automatiquement par le système. |
execute_action_initiated_time | datetime2 | Date à laquelle la recommandation a été appliquée. |
revert_action_start_time | datetime2 | Date à laquelle la recommandation a été rétablie. |
revert_action_duration | time | Durée de l’action de restauration. |
revert_action_initiated_by | nvarchar(4000) | User = Plan recommandé non appliqué manuellement par l’utilisateur.System = Recommandation rétablie automatiquement par le système. |
revert_action_initiated_time | datetime2 | Date à laquelle la recommandation a été rétablie. |
score | int | Valeur/effet estimé pour cette recommandation sur l’échelle de 0 à 100 (plus la plus grande est la meilleure) |
details | nvarchar(max) | Document JSON qui contient plus de détails sur la recommandation. Les champs suivants sont disponibles :planForceDetails - queryId - query_id de la requête régressée.- regressedPlanId - plan_id du plan régressé.- regressedPlanExecutionCount - Nombre d’exécutions de la requête avec un plan régressé avant la détection de la régression.- regressedPlanAbortedCount - Nombre d’erreurs détectées pendant l’exécution du plan régressé.- regressedPlanCpuTimeAverage - Temps processeur moyen (en micro secondes) consommé par la requête régressée avant la détection de la régression.- regressedPlanCpuTimeStddev - Écart type du temps processeur consommé par la requête régressée avant la détection de la régression.- recommendedPlanId - plan_id du plan qui devrait être forcé.- recommendedPlanExecutionCount - Nombre d’exécutions de la requête avec le plan qui doit être forcé avant la détection de la régression.- recommendedPlanAbortedCount - Nombre d’erreurs détectées pendant l’exécution du plan qui doit être forcé.- recommendedPlanCpuTimeAverage - Temps processeur moyen (en micro secondes) consommé par la requête exécutée avec le plan qui doit être forcé (calculé avant la détection de la régression).- recommendedPlanCpuTimeStddev Écart type du temps processeur consommé par la requête régressée avant la détection de la régression.implementationDetails - method - Méthode qui doit être utilisée pour corriger la régression. La valeur est toujours TSql .- script - Script Transact-SQL qui doit être exécuté pour forcer le plan recommandé. |
Notes
Les informations retournées par sys.dm_db_tuning_recommendations
sont mises à jour lorsque le moteur de base de données identifie la régression potentielle des performances des requêtes et n’est pas conservé. Les recommandations sont conservées uniquement tant que le moteur de base de données n’est pas redémarré. Utilisez la colonne sqlserver_start_time
dans sys.dm_os_sys_info pour rechercher la dernière heure de démarrage du moteur de base de données. Les administrateurs de base de données doivent régulièrement effectuer des copies de sauvegarde de la recommandation de paramétrage s’ils souhaitent le conserver après le recyclage du serveur.
Le currentValue
champ de la state
colonne peut avoir les valeurs suivantes :
Statut | Description |
---|---|
Active |
La recommandation est active et n’est pas encore appliquée. L’utilisateur peut prendre un script de recommandation et l’exécuter manuellement. |
Verifying |
La recommandation est appliquée par Moteur de base de données et le processus de vérification interne compare les performances du plan forcé avec le plan régressé. |
Success |
La recommandation est correctement appliquée. |
Reverted |
La recommandation est rétablie, car il n’y a pas de gains significatifs en matière de performances. |
Expired |
La recommandation a expiré et ne peut plus être appliquée. |
Le document JSON dans la state
colonne contient la raison qui décrit pourquoi est la recommandation dans l’état actuel. Les valeurs du champ motif peuvent être les suivantes :
Motif | Description |
---|---|
SchemaChanged |
La recommandation a expiré car le schéma d’une table référencée est modifié. Une nouvelle recommandation est créée si une nouvelle régression de plan de requête est détectée sur le nouveau schéma. |
StatisticsChanged |
La recommandation a expiré en raison de la modification statistique d’une table référencée. Une nouvelle recommandation est créée si une nouvelle régression de plan de requête est détectée en fonction de nouvelles statistiques. |
ForcingFailed |
Le plan recommandé ne peut pas être forcé sur une requête. Recherchez l’affichage last_force_failure_reason sys.query_store_plan pour trouver la raison de l’échec. |
AutomaticTuningOptionDisabled |
FORCE_LAST_GOOD_PLAN l’option est désactivée par l’utilisateur pendant le processus de vérification. Activez l’option FORCE_LAST_GOOD_PLAN à l’aide de l’instruction ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL) ou forcez le plan manuellement à l’aide du script dans la details colonne. |
UnsupportedStatementType |
Le plan ne peut pas être forcé sur la requête. Des exemples de requêtes non prises en charge sont des curseurs et INSERT BULK des instructions. |
LastGoodPlanForced |
La recommandation est correctement appliquée. |
AutomaticTuningOptionNotEnabled |
Moteur de base de données a identifié une régression potentielle des performances, mais l’option FORCE_LAST_GOOD_PLAN n’est pas activée : consultez ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL). Appliquez manuellement une recommandation ou activez l’option FORCE_LAST_GOOD_PLAN . |
VerificationAborted |
Le processus de vérification est abandonné en raison du redémarrage ou du nettoyage Magasin des requêtes. |
VerificationForcedQueryRecompile |
La requête est recompilée, car il n’y a pas d’amélioration significative des performances. |
PlanForcedByUser |
L’utilisateur a forcé manuellement le plan à l’aide de la procédure sp_query_store_force_plan (Transact-SQL). Le moteur de base de données n’applique pas la recommandation si l’utilisateur a décidé explicitement de forcer un plan. |
PlanUnforcedByUser |
L’utilisateur n’a pas appliqué manuellement le plan à l’aide de la procédure sp_query_store_unforce_plan (Transact-SQL). Étant donné que l’utilisateur a explicitement rétabli le plan recommandé, le moteur de base de données continue à utiliser le plan actuel et génère une nouvelle recommandation si une régression de plan se produit ultérieurement. |
UserForcedDifferentPlan |
L’utilisateur a forcé manuellement un autre plan à l’aide de la procédure sp_query_store_force_plan (Transact-SQL). Le moteur de base de données n’applique pas la recommandation si l’utilisateur a décidé explicitement de forcer un plan. |
TempTableChanged |
Une table temporaire utilisée dans le plan est modifiée. |
Les statistiques de la details
colonne n’affichent pas les statistiques du plan d’exécution (par exemple, l’heure actuelle du processeur). Les détails de la recommandation sont pris au moment de la détection de régression et décrivent pourquoi Moteur de base de données régression des performances identifiée. Utilisez et recommendedPlanId
interrogez regressedPlanId
Magasin des requêtes vues de catalogue pour rechercher des statistiques exactes du plan d’exécution.
Exemples d’utilisation des informations sur les recommandations de réglage
Exemple 1
L’exemple de code suivant obtient le script Transact-SQL généré qui force un bon plan pour une requête donnée :
SELECT name,
reason,
score,
JSON_VALUE(details, '$.implementationDetails.script') AS script,
details.*
FROM sys.dm_db_tuning_recommendations
CROSS APPLY OPENJSON(details, '$.planForceDetails') WITH (
[query_id] INT '$.queryId',
regressed_plan_id INT '$.regressedPlanId',
last_good_plan_id INT '$.recommendedPlanId'
) AS details
WHERE JSON_VALUE(STATE, '$.currentValue') = 'Active';
Exemple 2
Le code suivant obtient le script Transact-SQL généré qui force un bon plan pour une requête donnée et des informations supplémentaires sur le gain estimé :
SELECT reason,
score,
script = JSON_VALUE(details, '$.implementationDetails.script'),
planForceDetails.*,
estimated_gain = (regressedPlanExecutionCount + recommendedPlanExecutionCount) * (regressedPlanCpuTimeAverage - recommendedPlanCpuTimeAverage) / 1000000,
error_prone = IIF(regressedPlanErrorCount > recommendedPlanErrorCount, 'YES', 'NO')
FROM sys.dm_db_tuning_recommendations
CROSS APPLY OPENJSON(Details, '$.planForceDetails') WITH (
[query_id] INT '$.queryId',
regressedPlanId INT '$.regressedPlanId',
recommendedPlanId INT '$.recommendedPlanId',
regressedPlanErrorCount INT,
recommendedPlanErrorCount INT,
regressedPlanExecutionCount INT,
regressedPlanCpuTimeAverage FLOAT,
recommendedPlanExecutionCount INT,
recommendedPlanCpuTimeAverage FLOAT
) AS planForceDetails;
Exemple 3
Le code suivant obtient le script Transact-SQL généré qui force un bon plan pour une requête donnée et des informations supplémentaires qui incluent le texte de la requête et les plans de requête stockés dans Magasin des requêtes :
WITH cte_db_tuning_recommendations
AS (
SELECT reason,
score,
query_id,
regressedPlanId,
recommendedPlanId,
current_state = JSON_VALUE(STATE, '$.currentValue'),
current_state_reason = JSON_VALUE(STATE, '$.reason'),
script = JSON_VALUE(details, '$.implementationDetails.script'),
estimated_gain = (regressedPlanExecutionCount + recommendedPlanExecutionCount) *
(regressedPlanCpuTimeAverage - recommendedPlanCpuTimeAverage) / 1000000,
error_prone = IIF(regressedPlanErrorCount > recommendedPlanErrorCount, 'YES', 'NO')
FROM sys.dm_db_tuning_recommendations
CROSS APPLY OPENJSON(Details, '$.planForceDetails') WITH (
[query_id] INT '$.queryId',
regressedPlanId INT '$.regressedPlanId',
recommendedPlanId INT '$.recommendedPlanId',
regressedPlanErrorCount INT,
recommendedPlanErrorCount INT,
regressedPlanExecutionCount INT,
regressedPlanCpuTimeAverage FLOAT,
recommendedPlanExecutionCount INT,
recommendedPlanCpuTimeAverage FLOAT
)
)
SELECT qsq.query_id,
qsqt.query_sql_text,
dtr.*,
CAST(rp.query_plan AS XML) AS RegressedPlan,
CAST(sp.query_plan AS XML) AS SuggestedPlan
FROM cte_db_tuning_recommendations AS dtr
INNER JOIN sys.query_store_plan AS rp
ON rp.query_id = dtr.query_id
AND rp.plan_id = dtr.regressedPlanId
INNER JOIN sys.query_store_plan AS sp
ON sp.query_id = dtr.query_id
AND sp.plan_id = dtr.recommendedPlanId
INNER JOIN sys.query_store_query AS qsq
ON qsq.query_id = rp.query_id
INNER JOIN sys.query_store_query_text AS qsqt
ON qsqt.query_text_id = qsq.query_text_id;
Pour plus d’informations sur les fonctions JSON qui peuvent être utilisées pour interroger des valeurs dans la vue recommandation, consultez prise en charge json dans Moteur de base de données.
autorisations
Nécessite VIEW SERVER STATE
une autorisation dans SQL Server.
Nécessite l’autorisation VIEW DATABASE STATE
pour la base de données dans Azure SQL Database.
Autorisations pour SQL Server 2022 (et versions plus récentes)
Nécessite l'autorisation VIEW SERVER PERFORMANCE STATE
sur le serveur.