表达式的基数估计(CE)反馈

适用于:SQL Server 2025(17.x)预览版Azure SQL 数据库Microsoft Fabric 预览版中的 SQL 数据库

不准确的基数估计通常会导致查询优化期间性能不佳。 表达式的基数估计(CE)反馈基于最初由 CE 反馈功能引入的框架,进行扩展和完善。 目标是改进重复表达式的基数估计。 表达式功能的反馈从以前跨查询执行的表达式中学习,以查找适当的 CE 模型选择,并将所学到的内容应用于这些表达式的未来执行。 与 CE 反馈一样,模型建议会自动测试和应用于将来的查询执行。

表达式功能的反馈可识别和使用 模型假设来 更好地适应给定查询的表达式和数据分布,进而提高查询执行计划质量。 目前,表达式功能的反馈可以识别计划运算符,其中估计的行数和实际行数大相径庭。 当发生重大模型估计错误时,反馈将应用于查询中的表达式,并且有一个可行的备用模型可以尝试。

数据库引擎的不同版本根据数据的分布和查询方式使用不同的 CE 模型假设。

对表达式使用 CE 反馈

CE 反馈用于监控表达式的查询执行,并识别出导致基数估算一贯错误的子表达式。 反馈基于观察到的模式生成,并在查询编译期间应用,以提高估计准确性。

先决条件和配置

若要对表达式使用 CE 反馈,必须满足以下先决条件:

  • 数据库必须使用 兼容性级别 160 或更高版本
  • CE_FEEDBACK_FOR_EXPRESSIONS必须启用数据库范围的配置(默认启用)。
  • 若要检查数据库作用域配置的当前状态,请执行以下操作:
SELECT name,
       value,
       value_for_secondary
FROM sys.database_scoped_configurations
WHERE name = 'CE_FEEDBACK_FOR_EXPRESSIONS';

可以使用以下数据库范围的配置命令在数据库上启用该功能:

ALTER DATABASE SCOPED CONFIGURATION SET CE_FEEDBACK_FOR_EXPRESSIONS = ON;

要禁用数据库中“表达式反馈”这一功能,请禁用 CE_FEEDBACK_FOR_EXPRESSIONS 的数据库范围配置:

ALTER DATABASE SCOPED CONFIGURATION SET CE_FEEDBACK_FOR_EXPRESSIONS = OFF;

工作原理

虽然指纹不是 SQL Server 数据库引擎的新概念,但表达式功能的反馈上下文中的 指纹 是指表达式中计算签名的组合。 例如,虚构业务中的业务分析师可能希望获取有关客户的任何订单的信息,这些客户花费超过 10,000 美元。 涉及从“客户”表和“订单”表收集数据的选择语句可能是查看此类数据的一种方法:

SELECT *
FROM Customer AS C
     INNER JOIN Orders AS O
         ON C.custkey = O.o_custkey
WHERE O.o_totalprice > 10000;

对于此查询,查询优化器可能会选择从每个表 Customer 获取数据,然后 Orders 从这两个表中选择所有相关的列,并在订单的 大于 $10,000 时(带有筛选条件)联接这些数据。 每个逻辑表达式(例如查询计划中的筛选器或联接)都会生成一个有助于指纹的签名。 表达式的 CE 反馈使用这些指纹来了解和应用共享类似子表达式的查询的反馈,即使整个查询结构不同。

此功能重点关注在查询中具有一致基数过高估计/低估的表达式。 它分析目前不符合 CE 反馈条件的两种不同的工作负荷模式:

  • 工作负荷不重复执行,但具有重复的表达式模式。 例如,常用的联接模式。

  • 查询中的某一部分可能会从不同于同一查询中另一部分的 CE 模型中受益。 例如,表A与表B之间的联接可能需要简单的包含,而表C与表D之间的联接可能需要基本包含。

表达式功能反馈用于应用筛选器和联接假设来纠正估算错误问题,例如:

Filters:

  • ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES
  • ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES
  • ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES

Joins:

  • ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS
  • 基础控制假设(无需传递任何提示)

这些假设反映了不同的 CE 模型策略,例如包含和独立性。 有关更多概念背景,请参阅 Kate Smith 解释的基数估计反馈SQL Server 2016 中相关列的基数估计

提示生命周期

反馈提示依次通过以下状态:

  • 监视:系统观察子表达式的重复执行,并跟踪基数误估是否仍然存在。
  • 如果误估持续发生,可以在查询编译期间生成并应用反馈提示信息来调整 CE 模型。
  • 已阻止:如果某提示的应用导致基数估计不理想,则该提示将被阻止在将来使用。

此生命周期可确保仅在有益且避免估算质量回归时应用反馈。

回归保护

表达式的 CE 反馈包括回归保护。 如果提示导致基数估计比以前更差,该提示将被阻止。 但是,此保护仅限于基数估计,并且不会评估查询执行时间。 对于执行/运行时相关的回归, 自动计划更正 可能会进行干预。 如果未启用自动计划更正功能,则该功能将在sys.dm_db_tuning_recommendations动态管理视图中记录其将会执行的操作,并可通过查询获取。

遥测和监视

可以使用以下工具监视表达式活动的 CE 反馈:

  • 扩展事件:
    • adhoc_ce_feedback_query_level_telemetry
    • query_adhoc_ce_feedback_expression_hint
    • query_adhoc_ce_feedback_hint

CE 反馈扩展事件 query_ce_feedback_begin_analysisquery_ce_feedback_telemetry 在跟踪功能的活动时也很有用。

  • 指纹数据缓存在名为 AdHocCEFeedbackCache 的专用内存管理程序中。 可以通过系统目录视图 sys.dm_exec_ce_feedback_cache访问此缓存。

  • Showplan 集成

    应用表达式提示的 CE 反馈时,查询计划在 Showplan XML 中包含一个 CardinalityFeedback 属性。 此标记指示反馈用于调整特定子表达式的基数估计。

缓存和持久性

持久反馈存储在内部查询存储表中(sys.plan_persist_ce_feedback_for_expressions)中,并在启动时重新加载。 这可确保系统不需要重新获取已遇到的指纹反馈。 缓存持久性机制本质上是丢失的,这意味着反馈仅定期保存到磁盘。 暂留频率当前不可配置。

如果 SQL Server 实例在下一个持久性周期之前重启或内存被清除,则自上次刷新以来生成的反馈可能会丢失。

Limitations

持久性当前不适用于可读副本上的查询存储。 表达式的 CE 反馈可以针对主要副本和次要副本以不同的方式应用反馈。 但是,反馈不会保留在次要副本上,并且仅在该方案中的基于内存的缓存中存在。 如果发生故障转移事件,则会丢失任何可读辅助数据库上已获知的反馈。