Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op: SQL Server 2017 (14.x) en latere versies
Van Azure SQL Database
Azure SQL Managed Instance
Retourneert gedetailleerde informatie over aanbevelingen voor automatisch afstemmen. Zie Automatisch afstemmen voor meer informatie
Zie Bewaking en prestaties afstemmen in Azure SQL Database en Azure SQL Managed Instance voor meer informatie.
In Azure SQL Database kunnen dynamische beheerweergaven geen informatie weergeven die van invloed is op databaseinsluiting of informatie weergeven over andere databases waartoe de gebruiker toegang heeft. Om te voorkomen dat deze informatie zichtbaar wordt gemaakt, wordt elke rij met gegevens die geen deel uitmaken van de verbonden tenant uitgefilterd.
| Kolomnaam | Gegevenstype | Beschrijving |
|---|---|---|
| name | nvarchar(4000) | Unieke naam van aanbeveling. |
| type | nvarchar(4000) | De naam van de optie voor automatisch afstemmen die de aanbeveling heeft geproduceerd, bijvoorbeeld FORCE_LAST_GOOD_PLAN |
| reden | nvarchar(4000) | Reden waarom deze aanbeveling is opgegeven. |
| valid_since | datetime2 | De eerste keer dat deze aanbeveling is gegenereerd. |
| last_refresh | datetime2 | De laatste keer dat deze aanbeveling is gegenereerd. |
| state | nvarchar(4000) | JSON-document waarin de status van de aanbeveling wordt beschreven. De volgende velden zijn beschikbaar: - currentValue - huidige status van de aanbeveling.- reason - constante die beschrijft waarom de aanbeveling de huidige status heeft. |
| is_executable_action | bit | 1 = De aanbeveling kan worden uitgevoerd op de database via Transact-SQL script. 0 = De aanbeveling kan niet worden uitgevoerd voor de database (bijvoorbeeld: alleen informatie of teruggedraaide aanbeveling) |
| is_revertable_action | bit | 1 = De aanbeveling kan automatisch worden bewaakt en teruggedraaid door de database-engine. 0 = De aanbeveling kan niet automatisch worden bewaakt en teruggedraaid. De meeste uitvoerbare acties kunnen worden teruggedraaid. |
| execute_action_start_time | datetime2 | Datum waarop de aanbeveling wordt toegepast. |
| execute_action_duration | time | Duur van de uitvoeringsactie. |
| execute_action_initiated_by | nvarchar(4000) |
User = Handmatig geforceerd plan van gebruiker in de aanbeveling.System = Systeem automatisch toegepaste aanbeveling. |
| execute_action_initiated_time | datetime2 | De datum waarop de aanbeveling is toegepast. |
| revert_action_start_time | datetime2 | De datum waarop de aanbeveling is teruggedraaid. |
| revert_action_duration | time | Duur van de terugdraaiactie. |
| revert_action_initiated_by | nvarchar(4000) |
User = Handmatig niet-afgedwongen aanbevolen plan door gebruiker.System = Aanbeveling voor automatisch teruggedraaid systeem. |
| revert_action_initiated_time | datetime2 | De datum waarop de aanbeveling is teruggedraaid. |
| partituur | int | Geschatte waarde/effect voor deze aanbeveling op de schaal 0-100 (hoe groter des te beter) |
| bijzonderheden | nvarchar(max) | JSON-document met meer informatie over de aanbeveling. De volgende velden zijn beschikbaar:planForceDetails- queryId - query_id van de teruggedraaide query.- regressedPlanId - plan_id van het teruggedraaide plan.- regressedPlanExecutionCount - Aantal uitvoeringen van de query met teruggedraaid plan voordat de regressie wordt gedetecteerd.- regressedPlanAbortedCount - Aantal gedetecteerde fouten tijdens de uitvoering van het teruggedraaide plan.- regressedPlanCpuTimeAverage - Gemiddelde CPU-tijd (in micro seconden) die door de teruggedraaide query wordt verbruikt voordat de regressie wordt gedetecteerd.- regressedPlanCpuTimeStddev - Standaarddeviatie van de CPU-tijd die door de teruggedraaide query wordt verbruikt voordat de regressie wordt gedetecteerd.- recommendedPlanId - plan_id van het plan dat moet worden gedwongen.- recommendedPlanExecutionCount- Aantal uitvoeringen van de query met het plan dat moet worden afgedwongen voordat de regressie wordt gedetecteerd.- recommendedPlanAbortedCount - Aantal gedetecteerde fouten tijdens de uitvoering van het plan dat moet worden gedwongen.- recommendedPlanCpuTimeAverage - Gemiddelde CPU-tijd (in micro seconden) die wordt verbruikt door de query die wordt uitgevoerd met het plan dat moet worden geforceerd (berekend voordat de regressie wordt gedetecteerd).- recommendedPlanCpuTimeStddev Standaarddeviatie van de CPU-tijd die wordt verbruikt door de teruggedraaide query voordat de regressie wordt gedetecteerd.implementationDetails- method - De methode die moet worden gebruikt om de regressie te corrigeren. Waarde is altijd TSql.- script - Transact-SQL script dat moet worden uitgevoerd om het aanbevolen plan af te dwingen. |
Opmerkingen
Informatie die wordt geretourneerd door sys.dm_db_tuning_recommendations , wordt bijgewerkt wanneer de database-engine potentiële regressie van queryprestaties identificeert en niet persistent is. Aanbevelingen worden alleen bewaard totdat de database-engine opnieuw wordt opgestart. Gebruik de kolom sqlserver_start_time in sys.dm_os_sys_info om de laatste opstarttijd van de database-engine te vinden. Databasebeheerders moeten regelmatig back-ups maken van de aanbeveling voor afstemming als ze deze willen bewaren na het recyclen van de server.
Het currentValue veld in de state kolom heeft mogelijk de volgende waarden:
| Toestand | Description |
|---|---|
Active |
Aanbeveling is actief en is nog niet toegepast. Gebruiker kan het aanbevelingsscript gebruiken en handmatig uitvoeren. |
Verifying |
Aanbeveling wordt toegepast door database-engine en het interne verificatieproces vergelijkt de prestaties van het geforceerde plan met het teruggedraaide plan. |
Success |
Aanbeveling wordt toegepast. |
Reverted |
Aanbeveling wordt teruggedraaid omdat er geen aanzienlijke prestatieverbeteringen zijn. |
Expired |
Aanbeveling is verlopen en kan niet meer worden toegepast. |
JSON-document in state kolom bevat de reden waarom wordt beschreven waarom de aanbeveling de huidige status heeft. Waarden in het redenveld kunnen het volgende zijn:
| Reden | Description |
|---|---|
SchemaChanged |
Aanbeveling is verlopen omdat het schema van een tabel waarnaar wordt verwezen, wordt gewijzigd. Er wordt een nieuwe aanbeveling gemaakt als er een nieuwe regressie voor het queryplan wordt gedetecteerd in het nieuwe schema. |
StatisticsChanged |
Aanbeveling is verlopen vanwege de statistiekwijziging in een tabel waarnaar wordt verwezen. Er wordt een nieuwe aanbeveling gemaakt als er een nieuwe regressie voor het queryplan wordt gedetecteerd op basis van nieuwe statistieken. |
ForcingFailed |
Het aanbevolen plan kan niet worden afgedwongen voor een query. Zoek de last_force_failure_reason in de weergave sys.query_store_plan om de reden van de fout te achterhalen. |
AutomaticTuningOptionDisabled |
FORCE_LAST_GOOD_PLAN de optie is uitgeschakeld door de gebruiker tijdens het verificatieproces. Schakel FORCE_LAST_GOOD_PLAN de optie in met de instructie ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL) of forceer het plan handmatig met behulp van het script in de details kolom. |
UnsupportedStatementType |
Het plan kan niet worden afgedwongen voor de query. Voorbeelden van niet-ondersteunde query's zijn cursors en INSERT BULK instructies. |
LastGoodPlanForced |
Aanbeveling wordt toegepast. |
AutomaticTuningOptionNotEnabled |
Database-engine heeft mogelijke regressie van prestaties geïdentificeerd, maar de FORCE_LAST_GOOD_PLAN optie is niet ingeschakeld. Zie ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL). Pas de aanbeveling handmatig toe of schakel de optie in FORCE_LAST_GOOD_PLAN . |
VerificationAborted |
Verificatieproces wordt afgebroken vanwege het opnieuw opstarten of opschonen van Query Store. |
VerificationForcedQueryRecompile |
Query wordt opnieuw gecompileerd omdat er geen aanzienlijke prestatieverbetering is. |
PlanForcedByUser |
Gebruiker dwong het plan handmatig af met behulp van sp_query_store_force_plan (Transact-SQL) procedure. De database-engine past de aanbeveling niet toe als de gebruiker expliciet heeft besloten om een plan af te dwingen. |
PlanUnforcedByUser |
Gebruiker heeft het plan handmatig niet afgedwongen met behulp van sp_query_store_unforce_plan (Transact-SQL) procedure. Omdat de gebruiker het aanbevolen plan expliciet heeft teruggedraaid, blijft de database-engine het huidige plan gebruiken en genereert een nieuwe aanbeveling als er in de toekomst een planregressie plaatsvindt. |
UserForcedDifferentPlan |
Gebruiker dwong handmatig een ander plan af met behulp van sp_query_store_force_plan (Transact-SQL) procedure. De database-engine past de aanbeveling niet toe als de gebruiker expliciet heeft besloten om een plan af te dwingen. |
TempTableChanged |
Een tijdelijke tabel die in het plan is gebruikt, wordt gewijzigd. |
Statistieken in de details kolom bevatten geen statistieken van runtimeplannen (bijvoorbeeld de huidige CPU-tijd). De details van de aanbeveling worden genomen op het moment van regressiedetectie en beschrijven waarom database-engine prestatieregressie heeft geïdentificeerd. Gebruik regressedPlanId en recommendedPlanId om query's uit te voeren op query store-catalogusweergaven om exacte statistieken van runtime-plannen te vinden.
Voorbeelden van het gebruik van informatie over het afstemmen van aanbevelingen
Voorbeeld 1
De volgende voorbeeldcode haalt het gegenereerde Transact-SQL script op dat een goed plan voor een bepaalde query dwingt:
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';
Voorbeeld 2
Hieronder wordt het gegenereerde Transact-SQL script opgehaald dat een goed plan voor een bepaalde query afdingt en aanvullende informatie over de geschatte winst:
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;
Voorbeeld 3
Hieronder wordt het gegenereerde Transact-SQL script opgehaald waarmee een goed plan wordt afgevangen voor een bepaalde query en aanvullende informatie die de querytekst en de queryplannen bevat die zijn opgeslagen in Query Store:
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;
Zie JSON-ondersteuning in Database Engine voor meer informatie over JSON-functies die kunnen worden gebruikt voor het opvragen van waarden in de aanbevelingsweergave.
Permissions
Hiervoor is een machtiging in SQL Server vereist VIEW SERVER STATE .
Vereist de VIEW DATABASE STATE machtiging voor de database in Azure SQL Database.
Machtigingen voor SQL Server 2022 en hoger
Hiervoor is machtiging vereist VIEW SERVER PERFORMANCE STATE op de server.