Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к: SQL Server 2017 (14.x) и более поздних версий
базы данных SQL
Azure Для Управляемого экземпляра
SQL Azureв Microsoft Fabric
Возвращает подробные сведения о рекомендациях по автоматической настройке. Дополнительные сведения см. в разделе "Автоматическая настройка".
Дополнительные сведения см. в статье "Мониторинг и настройка производительности" в Базе данных SQL Azure и Управляемом экземпляре SQL Azure.
В базе данных SQL Azure динамические административные представления не могут предоставлять сведения, влияющие на доступность базы данных или предоставляющие сведения о других базах данных, к которым у пользователя есть доступ. Чтобы избежать предоставления этой информации, отфильтровывается каждая строка, содержащая данные, которые не принадлежат подключену клиенту.
| Имя столбца | Тип данных | Description |
|---|---|---|
name |
nvarchar(4000) | Уникальное имя рекомендации. |
type |
nvarchar(4000) | Имя параметра автоматической настройки, создающего рекомендацию, например FORCE_LAST_GOOD_PLAN. |
reason |
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 или принудительного выполнения плана вручную с помощью скрипта в столбце details . |
UnsupportedStatementType |
План нельзя принудительно принудить к запросу. Примерами неподдерживаемых запросов являются курсоры и INSERT BULK операторы. |
LastGoodPlanForced |
Рекомендация успешно применяется. |
AutomaticTuningOptionNotEnabled |
Ядро СУБД определило потенциальную регрессию производительности, но FORCE_LAST_GOOD_PLAN этот параметр не включен. Дополнительные сведения см. в разделе ALTER DATABASE SET AUTOMATIC_TUNING. Применение рекомендаций вручную или включение FORCE_LAST_GOOD_PLAN . |
VerificationAborted |
Процесс проверки прерван из-за перезагрузки или хранилище запросов очистки. |
VerificationForcedQueryRecompile |
Запрос перекомпилируется, так как нет значительного улучшения производительности. |
PlanForcedByUser |
Пользователь вручную заставил план с помощью процедуры sp_query_store_force_plan . Ядро СУБД не будет применять рекомендацию, если пользователь явно решил заставить какой-то план. |
PlanUnforcedByUser |
Пользователь вручную отменял план с помощью процедуры sp_query_store_unforce_plan . Так как пользователь явно вернул рекомендуемый план, ядро СУБД продолжает использовать текущий план и создает новую рекомендацию, если в будущем происходит регрессия плана. |
UserForcedDifferentPlan |
Пользователь вручную заставил другой план с помощью процедуры sp_query_store_force_plan . Ядро СУБД не будет применять рекомендацию, если пользователь явно решил заставить какой-то план. |
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] BIGINT '$.queryId',
regressed_plan_id BIGINT '$.regressedPlanId',
last_good_plan_id BIGINT '$.recommendedPlanId'
) AS details
WHERE JSON_VALUE(STATE, '$.currentValue') = 'Active';
Пример 2
Следующий запрос получает созданный скрипт Transact-SQL, который заставляет хороший план для любого заданного запроса и дополнительные сведения о предполагаемом выигрыше:
SELECT reason,
score,
JSON_VALUE(details, '$.implementationDetails.script') AS script,
planForceDetails.*,
(regressedPlanExecutionCount + recommendedPlanExecutionCount) * (regressedPlanCpuTimeAverage - recommendedPlanCpuTimeAverage) / 1000000 AS estimated_gain,
IIF (regressedPlanErrorCount > recommendedPlanErrorCount, 'YES', 'NO') AS error_prone
FROM sys.dm_db_tuning_recommendations
CROSS APPLY OPENJSON (details, '$.planForceDetails') WITH (
[query_id] BIGINT '$.queryId',
regressedPlanId BIGINT '$.regressedPlanId',
recommendedPlanId BIGINT '$.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,
JSON_VALUE(STATE, '$.currentValue') AS current_state,
JSON_VALUE(STATE, '$.reason') AS current_state_reason,
JSON_VALUE(details, '$.implementationDetails.script') AS script,
(regressedPlanExecutionCount + recommendedPlanExecutionCount) * (regressedPlanCpuTimeAverage - recommendedPlanCpuTimeAverage) / 1000000 AS estimated_gain,
IIF (regressedPlanErrorCount > recommendedPlanErrorCount, 'YES', 'NO') AS error_prone
FROM sys.dm_db_tuning_recommendations
CROSS APPLY OPENJSON (details, '$.planForceDetails') WITH (
[query_id] BIGINT '$.queryId',
regressedPlanId BIGINT '$.regressedPlanId',
recommendedPlanId BIGINT '$.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 в SQL Server.
Разрешения
ДЛЯ SQL Server 2022 (16.x) и более ранних версий требуется VIEW SERVER STATE разрешение на SQL Server.
SQL Server 2022 (16.x) и База данных SQL Azure требуют VIEW SERVER PERFORMANCE STATE разрешения на сервере.
Связанный контент
- Автоматическая настройка
- sys.database_automatic_tuning_options (Transact-SQL)
- sys.database_query_store_options (Transact-SQL)
- Данные JSON в SQL Server
- sys.dm_os_sys_info (Transact-SQL)