Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro: SQL Server 2017 (14.x) a novější verze
databáze SQL Azure SQL Database
Azure SQL Managed Instance
v Microsoft Fabric
Vrátí podrobné informace o doporučeních automatického ladění. Další informace najdete v tématu Automatické ladění
Další informace najdete v tématu Monitorování a ladění výkonu ve službě Azure SQL Database a azure SQL Managed Instance.
V Azure SQL Database nemůžou zobrazení dynamické správy zveřejnit informace, které by ovlivnily uzavření databáze nebo zpřístupnily informace o jiných databázích, ke kterým má uživatel přístup. Aby se zabránilo zveřejnění těchto informací, vyfiltruje se každý řádek obsahující data, která nepatří do připojeného tenanta.
| Název sloupce | Datový typ | Description |
|---|---|---|
| název | nvarchar(4000) | Jedinečný název doporučení |
| type | nvarchar(4000) | Název možnosti automatického ladění, která doporučení vytvořila, například FORCE_LAST_GOOD_PLAN |
| důvod | nvarchar(4000) | Důvod, proč bylo toto doporučení poskytnuto |
| valid_since | datetime2 | Při prvním vygenerování tohoto doporučení. |
| last_refresh | datetime2 | Čas posledního vygenerování tohoto doporučení |
| state | nvarchar(4000) | Dokument JSON, který popisuje stav doporučení. K dispozici jsou následující pole: - currentValue - aktuální stav doporučení.- reason – konstanta, která popisuje, proč je doporučení v aktuálním stavu. |
| is_executable_action | bit | 1 = Doporučení lze provést pro databázi prostřednictvím Transact-SQL skriptu. 0 = Doporučení nelze spouštět v databázi (například pouze informace nebo doporučení vrácená zpět) |
| is_revertable_action | bit | 1 = Doporučení lze automaticky monitorovat a vrátit zpět databázovým strojem. 0 = Doporučení nelze automaticky monitorovat a vrátit zpět. Většina spustitelných akcí bude vrácena zpět. |
| execute_action_start_time | datetime2 | Datum, kdy se doporučení použije |
| execute_action_duration | time | Doba trvání akce provedení. |
| execute_action_initiated_by | nvarchar(4000) |
User = Plán vynuceného vynucení uživatele v doporučení.System = Systém automaticky použil doporučení. |
| execute_action_initiated_time | datetime2 | Datum, kdy se doporučení použilo |
| revert_action_start_time | datetime2 | Datum, kdy bylo doporučení vráceno. |
| revert_action_duration | time | Doba trvání akce vrácení. |
| revert_action_initiated_by | nvarchar(4000) |
User = Uživatel ručně nevynucený doporučený plán.System = Systém automaticky vrátil doporučení. |
| revert_action_initiated_time | datetime2 | Datum, kdy bylo doporučení vráceno. |
| partitura | int | Odhadovaná hodnota/účinek tohoto doporučení na měřítko 0–100 (čím větší je lepší) |
| podrobnosti | nvarchar(max) | Dokument JSON, který obsahuje další podrobnosti o doporučení. K dispozici jsou následující pole:planForceDetails- queryId – query_id regresního dotazu.- regressedPlanId - plan_id regresního plánu.- regressedPlanExecutionCount – Počet spuštění dotazu s regresí plánu před zjištěním regrese.- regressedPlanAbortedCount – Počet zjištěných chyb během provádění regresního plánu.- regressedPlanCpuTimeAverage – Průměrná doba procesoru (v mikrosekundách) spotřebovaná regresním dotazem před zjištěním regrese.- regressedPlanCpuTimeStddev – Směrodatná odchylka času procesoru spotřebovaného regresním dotazem před zjištěním regrese.- recommendedPlanId - plan_id plánu, který by měl být vynucen.- recommendedPlanExecutionCount– Počet spuštění dotazu s plánem, který by měl být vynucen před zjištěním regrese.- recommendedPlanAbortedCount – Počet zjištěných chyb při provádění plánu, které by měly být vynuceny.- recommendedPlanCpuTimeAverage – Průměrná doba procesoru (v mikrosekundách) spotřebovaná dotazem spuštěným s plánem, který by měl být vynucen (vypočítán před zjištěním regrese).- recommendedPlanCpuTimeStddev Směrodatná odchylka času procesoru spotřebovaného regresním dotazem před zjištěním regreseimplementationDetails- method - Metoda, která by měla být použita k opravě regrese. Hodnota je vždy TSql.- script – Transact-SQL skript, který by se měl provést, aby se vynutil doporučený plán. |
Poznámky
Informace vrácené databázovým strojem sys.dm_db_tuning_recommendations se aktualizují, když databázový stroj identifikuje potenciální regresi výkonu dotazů a neuchovává se. Doporučení se uchovávají pouze do restartování databázového stroje. Pomocí sloupce sqlserver_start_time v sys.dm_os_sys_info vyhledejte čas posledního spuštění databázového stroje. Správci databází by měli pravidelně vytvářet záložní kopie doporučení pro ladění, pokud je chtějí zachovat po recyklaci serveru.
Pole currentValue ve sloupci state může mít následující hodnoty:
| Stav | Description |
|---|---|
Active |
Doporučení je aktivní a ještě není použito. Uživatel může přijmout skript doporučení a spustit ho ručně. |
Verifying |
Doporučení se používá databázovým strojem a procesem interního ověření porovnává výkon vynuceného plánu s regresním plánem. |
Success |
Doporučení se úspěšně použije. |
Reverted |
Doporučení se vrátí, protože nedošlo k významným nárůstu výkonu. |
Expired |
Vypršela platnost doporučení a už se nedá použít. |
Dokument JSON ve state sloupci obsahuje důvod, proč je doporučení v aktuálním stavu. Hodnoty v poli důvodu můžou být:
| Důvod | Description |
|---|---|
SchemaChanged |
Doporučení vypršelo, protože došlo ke změně schématu odkazované tabulky. Pokud se v novém schématu zjistí regrese nového plánu dotazů, vytvoří se nové doporučení. |
StatisticsChanged |
Doporučení vypršelo kvůli změně statistiky v odkazované tabulce. Nové doporučení se vytvoří, pokud se na základě nových statistik zjistí regrese nového plánu dotazů. |
ForcingFailed |
Doporučený plán nelze v dotazu vynutit.
last_force_failure_reason Vyhledejte v zobrazení sys.query_store_plan důvod selhání. |
AutomaticTuningOptionDisabled |
FORCE_LAST_GOOD_PLAN uživatel během procesu ověření tuto možnost zakázal. Povolte FORCE_LAST_GOOD_PLAN možnost pomocí příkazu ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL) nebo vynuťte plán ručně pomocí skriptu ve sloupci details . |
UnsupportedStatementType |
Plán nelze v dotazu vynutit. Příklady nepodporovaných dotazů jsou kurzory a INSERT BULK příkazy. |
LastGoodPlanForced |
Doporučení se úspěšně použije. |
AutomaticTuningOptionNotEnabled |
Databázový stroj identifikoval potenciální regresi výkonu FORCE_LAST_GOOD_PLAN , ale tato možnost není povolená – viz ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL). Použijte doporučení ručně nebo povolte FORCE_LAST_GOOD_PLAN možnost. |
VerificationAborted |
Proces ověření se přeruší kvůli restartování nebo vyčištění úložiště dotazů. |
VerificationForcedQueryRecompile |
Dotaz je rekompilován, protože nedošlo k významnému zlepšení výkonu. |
PlanForcedByUser |
Uživatel ručně vynutil plán pomocí postupu sp_query_store_force_plan (Transact-SQL). Databázový stroj doporučení nepoužije, pokud se uživatel explicitně rozhodl vynutit nějaký plán. |
PlanUnforcedByUser |
Uživatel ručně nevynucoval plán pomocí postupu sp_query_store_unforce_plan (Transact-SQL). Vzhledem k tomu, že se uživatel výslovně vrátil k doporučenému plánu, bude databázový stroj dál používat aktuální plán a vygenerovat nové doporučení, pokud v budoucnu dojde k nějaké regresi plánu. |
UserForcedDifferentPlan |
Uživatel ručně vynutil jiný plán pomocí postupu sp_query_store_force_plan (Transact-SQL). Databázový stroj doporučení nepoužije, pokud se uživatel explicitně rozhodl vynutit nějaký plán. |
TempTableChanged |
Změní se dočasná tabulka použitá v plánu. |
Statistiky ve details sloupci nezobrazují statistiky plánu modulu runtime (například aktuální čas procesoru). Podrobnosti o doporučení se provádějí v době detekce regrese a popisují, proč databázový stroj identifikoval regresi výkonu. Pomocí regressedPlanId a recommendedPlanId dotazem na zobrazení katalogu úložiště dotazů vyhledejte přesné statistiky plánu modulu runtime.
Příklady použití informací o doporučeních pro ladění
Příklad 1
Následující ukázkový kód získá vygenerovaný Transact-SQL skript, který vynutí dobrý plán pro každý daný dotaz:
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';
Příklad 2
Následující kód získá vygenerovaný Transact-SQL skript, který vynutí dobrý plán pro každý daný dotaz a další informace o odhadovaném získání:
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;
Příklad 3
Následující kód získá vygenerovaný Transact-SQL skript, který vynutí dobrý plán pro každý daný dotaz a další informace, které obsahují text dotazu a plány dotazů uložené v úložišti dotazů:
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;
Další informace o funkcích JSON, které lze použít k dotazování hodnot v zobrazení doporučení, najdete v tématu Podpora JSON v databázovém stroji.
Povolení
Vyžaduje VIEW SERVER STATE oprávnění v SQL Serveru.
VIEW DATABASE STATE Vyžaduje oprávnění pro databázi ve službě Azure SQL Database.
Oprávnění pro SQL Server 2022 a novější
Vyžaduje VIEW SERVER PERFORMANCE STATE oprávnění na serveru.
Další kroky
- automatické ladění
- sys.database_automatic_tuning_options (Transact-SQL)
- sys.database_query_store_options (Transact-SQL)
- Podpora JSON
- sys.dm_os_sys_info (Transact-SQL)