sys.dm_db_tuning_recommendations (Transact-SQL)
Область применения: SQL Server 2017 (14.x) и более поздних версий База данных SQL Azure Управляемый экземпляр SQL Azure
Возвращает подробные сведения о рекомендациях по автоматической настройке. Дополнительные сведения см. в разделе "Автоматическая настройка"
Дополнительные сведения см. в разделе "Мониторинг и настройка производительности" в База данных SQL Azure и Управляемый экземпляр SQL Azure.
В База данных SQL Azure динамические административные представления не могут предоставлять сведения, влияющие на доступность базы данных или предоставление сведений о других базах данных, к которым у пользователя есть доступ. Чтобы избежать предоставления этой информации, отфильтровывается каждая строка, содержащая данные, которые не принадлежат подключену клиенту.
Имя столбца | Тип данных | Description |
---|---|---|
name | nvarchar(4000) | Уникальное имя рекомендации. |
type | nvarchar(4000) | Имя параметра автоматической настройки, создающего рекомендацию, например. FORCE_LAST_GOOD_PLAN |
причина | nvarchar(4000) | Причина, по которой была предоставлена эта рекомендация. |
valid_since | datetime2 | При первом создании этой рекомендации. |
last_refresh | datetime2 | При последнем создании этой рекомендации. |
state | nvarchar(4000) | Документ JSON, описывающий состояние рекомендации. Доступны следующие поля: - currentValue — текущее состояние рекомендации.- reason — константы, описывающие, почему рекомендация находится в текущем состоянии. |
is_executable_action | bit | 1 = рекомендация может выполняться в базе данных с помощью скрипта Transact-SQL. 0 = рекомендация не может быть выполнена в базе данных (например, сведения только или отмененная рекомендация). |
is_revertable_action | bit | 1 = рекомендация может быть автоматически отслеживаема и отменена ядром СУБД. 0 = рекомендация не может быть автоматически отслеживаема и отменена. Большинство исполняемых действий будут восстановлены. |
execute_action_start_time | datetime2 | Дата применения рекомендации. |
execute_action_duration | time | Длительность действия выполнения. |
execute_action_initiated_by | nvarchar(4000) | User = Пользовательский план вручную принудительного плана в рекомендации.System = автоматически примененная система рекомендация. |
execute_action_initiated_time | datetime2 | Дата применения рекомендации. |
revert_action_start_time | datetime2 | Дата отмены рекомендации. |
revert_action_duration | time | Длительность действия возврата. |
revert_action_initiated_by | nvarchar(4000) | User = рекомендуемый план вручную без принудительного выполнения.System = система автоматически отменяет рекомендацию. |
revert_action_initiated_time | datetime2 | Дата отмены рекомендации. |
score | int | Предполагаемое значение и эффект для этой рекомендации по шкале 0–100 (чем больше, тем лучше) |
details | nvarchar(max) | Документ JSON, содержащий дополнительные сведения о рекомендации. Доступны следующие поля:planForceDetails - queryId — query_id регрессированного запроса.- regressedPlanId — plan_id регрессивного плана.- regressedPlanExecutionCount — Количество выполнения запроса с регрессивным планом до обнаружения регрессии.- regressedPlanAbortedCount — количество обнаруженных ошибок во время выполнения регрессированного плана.- regressedPlanCpuTimeAverage — Среднее время ЦП (в микро секундах), потребляемое регрессией запроса до обнаружения регрессии.- regressedPlanCpuTimeStddev — Стандартное отклонение ЦП, затраченное регрессией запроса до обнаружения регрессии.- recommendedPlanId - plan_id плана, который должен быть вынужден.- recommendedPlanExecutionCount — Количество выполнений запроса с планом, который должен быть вынужден до обнаружения регрессии.- recommendedPlanAbortedCount — количество обнаруженных ошибок во время выполнения плана, которое должно быть принудительно.- recommendedPlanCpuTimeAverage — среднее время ЦП (в микро секундах), используемое запросом, выполняемым с планом, который должен быть вынужден (вычисляется до обнаружения регрессии).- recommendedPlanCpuTimeStddev Стандартное отклонение ЦП, затраченное регрессией запроса до обнаружения регрессии.implementationDetails - method — метод, который следует использовать для исправления регрессии. Значение всегда TSql равно.- script — Скрипт Transact-SQL, который должен быть выполнен для принудительного принудительного выполнения рекомендуемого плана. |
Замечания
Информация, возвращаемая обновлением sys.dm_db_tuning_recommendations
, когда ядро СУБД определяет потенциальную регрессию производительности запросов и не сохраняется. Рекомендации сохраняются только до перезапуска ядра СУБД. Узнать время последнего запуска ядра СУБД можно в столбце sqlserver_start_time
из sys.dm_os_sys_info. Администраторы базы данных должны периодически создавать резервные копии рекомендации по настройке, если они хотят сохранить ее после перезапуска сервера.
Поле currentValue
в столбце state
может иметь следующие значения:
Состояние | Description |
---|---|
Active |
Рекомендация активна и еще не применяется. Пользователь может выполнять скрипт рекомендаций и выполнять его вручную. |
Verifying |
Рекомендации применяются ядро СУБД и внутренний процесс проверки сравнивает производительность принудительного плана с регрессивным планом. |
Success |
Рекомендация успешно применяется. |
Reverted |
Рекомендация отменена, так как нет значительных показателей производительности. |
Expired |
Срок действия рекомендации истек и больше не может применяться. |
Документ JSON в state
столбце содержит причину, которая описывает, почему рекомендация находится в текущем состоянии. Значения в поле причины могут быть:
Причина | Description |
---|---|
SchemaChanged |
Срок действия рекомендации истек, так как схема указанной таблицы изменена. При обнаружении регрессии нового плана запроса на новую схему будет создана новая рекомендация. |
StatisticsChanged |
Срок действия рекомендации истек из-за изменения статистики в указанной таблице. Новая рекомендация будет создана, если обнаружена регрессия нового плана запроса на основе новой статистики. |
ForcingFailed |
Рекомендуемый план нельзя принудительно принудить к запросу. last_force_failure_reason Найдите в представлении sys.query_store_plan причину сбоя. |
AutomaticTuningOptionDisabled |
FORCE_LAST_GOOD_PLAN параметр отключен пользователем во время проверки. Включение FORCE_LAST_GOOD_PLAN параметра с помощью инструкции ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL) или принудительного выполнения плана вручную с помощью скрипта в столбце details . |
UnsupportedStatementType |
План нельзя принудительно принудить к запросу. Примерами неподдерживаемых запросов являются курсоры и INSERT BULK операторы. |
LastGoodPlanForced |
Рекомендация успешно применяется. |
AutomaticTuningOptionNotEnabled |
ядро СУБД обнаружена потенциальная регрессия производительности, но параметр FORCE_LAST_GOOD_PLAN не включен. См. раздел ALTER DATABASE SET AUTOMATIC_TUNING (Transact-SQL). Применение рекомендаций вручную или включение FORCE_LAST_GOOD_PLAN . |
VerificationAborted |
Процесс проверки прерван из-за перезагрузки или хранилище запросов очистки. |
VerificationForcedQueryRecompile |
Запрос перекомпилируется, так как нет значительного улучшения производительности. |
PlanForcedByUser |
Пользователь вручную заставил план с помощью процедуры sp_query_store_force_plan (Transact-SQL). Ядро СУБД не будет применять рекомендацию, если пользователь явно решил заставить какой-то план. |
PlanUnforcedByUser |
Пользователь вручную отменял план с помощью процедуры sp_query_store_unforce_plan (Transact-SQL). Так как пользователь явно вернул рекомендуемый план, ядро СУБД будет продолжать использовать текущий план и создать новую рекомендацию, если в будущем произойдет регрессия плана. |
UserForcedDifferentPlan |
Пользователь вручную принудил другой план с помощью процедуры sp_query_store_force_plan (Transact-SQL). Ядро СУБД не будет применять рекомендацию, если пользователь явно решил заставить какой-то план. |
TempTableChanged |
Изменяется временная таблица, используемая в плане. |
Статистика в столбце details
не отображает статистику плана выполнения (например, текущее время ЦП). Сведения о рекомендации принимаются во время обнаружения регрессии и описывают, почему ядро СУБД идентифицированная регрессия производительности. Используйте regressedPlanId
и recommendedPlanId
запрашивайте представления каталога хранилище запросов для поиска точной статистики плана выполнения.
Примеры использования сведений о рекомендациях по настройке
Пример 1
Следующий пример кода получает созданный скрипт Transact-SQL, который заставляет хороший план для любого заданного запроса:
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';
Пример 2
Ниже показано, как получить созданный скрипт Transact-SQL, который заставляет хороший план для любого заданного запроса и дополнительные сведения о предполагаемом выигрыше:
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;
Пример 3
Ниже показано, как получить созданный скрипт Transact-SQL, который заставляет хороший план для любого заданного запроса и дополнительных сведений, включающих текст запроса и планы запросов, хранящиеся в хранилище запросов:
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;
Дополнительные сведения о функциях JSON, которые можно использовать для запроса значений в представлении рекомендаций, см. в разделе "Поддержка JSON" в ядро СУБД.
Разрешения
Требуется VIEW SERVER STATE
разрешение в SQL Server.
Требуется VIEW DATABASE STATE
разрешение для базы данных в База данных SQL Azure.
Разрешения для SQL Server 2022 и более поздних версий
Необходимо разрешение VIEW SERVER PERFORMANCE STATE
на сервере.