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都从更改为 TRUEFALSE 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_scriptplan_typeis_optimized_plan_forcing_disabledplan_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_descforce_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;