sys.query_store_plan (Transact-SQL)
适用于: SQL Server 2016(13.x)及更高版本Azure SQL 数据库Azure SQL 托管实例 Azure Synapse Analytics
包含与查询关联的每个执行计划的相关信息。
列名称 | 数据类型 | 说明 |
---|---|---|
plan_id |
bigint | 主密钥。 |
query_id |
bigint | 外键。 联接到 sys.query_store_query (Transact-SQL)。 |
plan_group_id |
bigint | 计划组的 ID。 游标查询通常需要多个(填充和提取)计划。 一起编译的填充和提取计划位于同一个组中。0 表示计划不在组中。 |
engine_version |
nvarchar(32) | 用于以格式编译计划的 <major>.<minor>.<build>.<revision> 引擎版本。 |
compatibility_level |
smallint | 查询中引用的数据库的数据库兼容性级别。 |
query_plan_hash |
binary(8) | 单个计划的 MD5 哈希。 |
query_plan |
nvarchar(max) | 查询计划的 Showplan XML。 |
is_online_index_plan |
bit | 联机索引生成期间使用了计划。 注意: Azure Synapse Analytics 始终返回 0 。 |
is_trivial_plan |
bit | 计划是一个普通的计划(查询优化器第 0 阶段的输出)。 注意: Azure Synapse Analytics 始终返回 0 。 |
is_parallel_plan |
bit | 计划是并行的。 注意: Azure Synapse Analytics 始终返回 1 。 |
is_forced_plan |
bit | 当用户执行存储过程 sys.sp_query_store_force_plan 时,计划被标记为强制。 强制机制 不保证 此确切计划将用于引用的 query_id 查询。 计划强制会导致再次编译查询,并且通常生成与引用 plan_id 的计划完全相同或类似的计划。 如果计划强制不成功, force_failure_count 则会递增,并 last_force_failure_reason 填充失败原因。注意: Azure Synapse Analytics 始终返回 0 。 |
is_natively_compiled |
bit | 计划包括本机编译的内存优化过程。 (0 = FALSE ,1 = TRUE )。注意: Azure Synapse Analytics 始终返回 0 。 |
force_failure_count |
bigint | 强制执行此计划失败的次数。 仅当重新编译查询时(不是针对每次执行)才能递增该次数。 每次is_plan_forced 都从更改为 TRUE FALSE 0重置。注意: Azure Synapse Analytics 始终返回 0 。 |
last_force_failure_reason |
int | 计划强制失败的原因。 0:无故障,否则为导致强制失败的错误号 3617: COMPILATION_ABORTED_BY_CLIENT 8637: ONLINE_INDEX_BUILD 8675: OPTIMIZATION_REPLAY_FAILED 8683: INVALID_STARJOIN 8684: TIME_OUT 8689: NO_DB 8690: HINT_CONFLICT 8691: SETOPT_CONFLICT 8694: DQ_NO_FORCING_SUPPORTED 8698: NO_PLAN 8712: NO_INDEX 8713: VIEW_COMPILE_FAILED <其他值>: GENERAL_FAILURE 注意: Azure Synapse Analytics 始终返回 0 。 |
last_force_failure_reason_desc |
nvarchar(128) | 的文本说明 last_force_failure_reason 。COMPILATION_ABORTED_BY_CLIENT :客户端中止的查询编译,然后再完成ONLINE_INDEX_BUILD :当目标表具有正在联机生成的索引时,查询会尝试修改数据OPTIMIZATION_REPLAY_FAILED :优化重播脚本无法执行。INVALID_STARJOIN :计划包含无效的 StarJoin 规范TIME_OUT :优化器在搜索强制计划指定的计划时超出了允许的操作数NO_DB :计划中指定的数据库不存在HINT_CONFLICT :无法编译查询,因为计划与查询提示冲突DQ_NO_FORCING_SUPPORTED :无法执行查询,因为计划与使用分布式查询或全文操作冲突。NO_PLAN :查询处理器无法生成查询计划,因为强制计划无法验证为对查询有效NO_INDEX :计划中指定的索引不再存在VIEW_COMPILE_FAILED :由于计划中引用的索引视图中存在问题,无法强制查询计划GENERAL_FAILURE :一般强制错误(其他原因未涵盖)注意: Azure Synapse Analytics 始终返回 NONE 。 |
count_compiles |
bigint | 计划编译统计信息。 |
initial_compile_start_time |
datetimeoffset | 计划编译统计信息。 |
last_compile_start_time |
datetimeoffset | 计划编译统计信息。 |
last_execution_time |
datetimeoffset | 上次执行时间是指查询/计划的最后结束时间。 |
avg_compile_duration |
float | 计划编译统计信息(以微秒为单位)。 除以 1,000,000 以获取秒。 |
last_compile_duration |
bigint | 计划编译统计信息(以微秒为单位)。 除以 1,000,000 以获取秒。 |
plan_forcing_type |
int | 适用于: SQL Server 2017 (14.x) 及更高版本 计划强制类型。 0: NONE 1: MANUAL 2: AUTO |
plan_forcing_type_desc |
nvarchar(60) | 适用于: SQL Server 2017 (14.x) 及更高版本 文本说明 plan_forcing_type 。NONE :没有强制计划MANUAL :规划用户强制AUTO :计划由自动优化强制进行。 |
has_compile_replay_script |
bit | 适用于:SQL Server 2022 (16.x) 及更高版本 指示计划是否具有与之关联的优化重播脚本: 0 = 无优化重播脚本(没有甚至无效)。 1 = 记录的优化重播脚本。 不适用于 Azure Synapse Analytics。 |
is_optimized_plan_forcing_disabled |
bit | 适用于:SQL Server 2022 (16.x) 及更高版本 指示是否为计划禁用了优化计划强制: 0 = 已禁用。 1 = 未禁用。 不适用于 Azure Synapse Analytics。 |
plan_type |
int | 适用于:SQL Server 2022 (16.x) 及更高版本 计划类型。 0:已编译的计划 1:调度程序计划 2:查询变体计划 不适用于 Azure Synapse Analytics。 |
plan_type_desc |
nvarchar(120) | 适用于:SQL Server 2022 (16.x) 及更高版本 计划类型的文本说明。 已编译的计划:指示计划是非参数敏感计划优化计划 调度程序计划:指示计划是参数敏感计划优化调度程序计划 查询变体计划:指示计划是参数敏感计划优化查询变体计划 不适用于 Azure Synapse Analytics。 |
注解
启用辅助副本查询存储时,可以强制实施多个计划。
在 Azure Synapse Analytics 中,使用列has_compile_replay_script
,plan_type
is_optimized_plan_forcing_disabled
plan_type_desc
会导致Invalid Column Name
错误,因为它们不受支持。 有关如何在 Azure Synapse Analytics 中使用的sys.query_store_plan
示例,请参阅示例 B。
计划强制限制
查询存储中具有一种可用于强制查询优化器使用特定执行计划的机制。 但是,有些限制可能会阻止计划强制执行。
首先,计划是否包含以下构造:
- 插入批量语句
- 对外部表的引用
- 分布式查询或全文操作
- 使用弹性查询
- 动态或键集游标
- 无效的星型联接规范
注意
Azure SQL 数据库和 SQL Server 2019 及更高版本版本支持强制使用静态和快速向前游标的计划。
其次,计划依赖的对象何时不再可用:
- 数据库(如果数据库(如果计划起源的数据库不再存在)
- 索引(不再存在或已禁用)
最后,计划本身的问题:
- 用于查询不合法
- 查询优化器超出了允许的操作数
- 格式不正确的计划 XML
权限
需要 VIEW DATABASE STATE
权限。
示例
A. 查找 SQL Server 无法通过 QDS 强制计划的原因
注意和last_force_failure_reason_desc
force_failure_count
列:
SELECT TOP 1000
p.query_id,
p.plan_id,
p.last_force_failure_reason_desc,
p.force_failure_count,
p.last_compile_start_time,
p.last_execution_time,
q.last_bind_duration,
q.query_parameterization_type_desc,
q.context_settings_id,
c.set_options,
c.STATUS
FROM sys.query_store_plan p
INNER JOIN sys.query_store_query q
ON p.query_id = q.query_id
INNER JOIN sys.query_context_settings c
ON c.context_settings_id = q.context_settings_id
LEFT JOIN sys.query_store_query_text t
ON q.query_text_id = t.query_text_id
WHERE p.is_forced_plan = 1
AND p.last_force_failure_reason != 0;
B. 在 Azure Synapse Analytics 中查看查询计划结果的查询
使用以下示例查询在 Azure Synapse Analytics 的 查询存储中查找 100 个最新的执行计划。
SELECT TOP 100
plan_id,
query_id,
plan_group_id,
engine_version,
compatibility_level,
query_plan_hash,
query_plan,
is_online_index_plan,
is_trivial_plan,
is_parallel_plan,
is_forced_plan,
is_natively_compiled,
force_failure_count,
last_force_failure_reason,
last_force_failure_reason_desc,
count_compiles,
initial_compile_start_time,
last_compile_start_time,
last_execution_time,
avg_compile_duration,
last_compile_duration,
plan_forcing_type,
plan_forcing_type_desc
FROM sys.query_store_plan
ORDER BY last_execution_time DESC;
相关内容
- 使用查询存储来监视性能
- sys.database_query_store_options (Transact-SQL)
- sys.query_context_settings (Transact-SQL)
- sys.query_store_query (Transact-SQL)
- sys.query_store_query_text (Transact-SQL)
- sys.query_store_runtime_stats (Transact-SQL)
- sys.query_store_wait_stats (Transact-SQL)
- sys.query_store_runtime_stats_interval (Transact-SQL)
- 系统目录视图 (Transact-SQL)
- 查询存储存储过程 (Transact-SQL)