描述智能查询处理

已完成

在 SQL Server 2017 和 2019 以及 Azure SQL 中,Microsoft 在兼容性级别 140 和 150 中引入了许多新功能。 其中许多功能纠正了以前的反模式,例如使用用户定义的标量值函数和使用表变量。

这些功能分为以下几个功能系列:

智能查询处理体系结构的屏幕截图。

智能查询处理包括通过最少实现工作量提高现有工作负荷性能的功能。

若要使工作负荷自动有资格进行智能查询处理,请将适用的数据库兼容性级别更改为 150。 例如:

ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 150;

自适应查询处理

自适应查询处理包含多个选项,这些选项根据查询的执行上下文,更动态地进行查询处理。 其中包括增强查询处理的若干功能。

  • 自适应联接 - 数据库引擎根据进入联接的行数,在哈希和嵌套循环之间延迟选择联接。 自适应联接当前仅在批处理执行模式下工作。

  • 交错执行 - 此功能目前支持多语句表值函数 (MSTVF)。 在 SQL Server 2017 之前,MSTVF 根据 SQL Server 的版本使用固定的行估值,即 1 或 100 行。 如果该函数返回更多的行,则此估值可能会导致查询计划欠佳。 将在计划的其余部分使用交错执行进行编译之前,从 MSTVF 生成实际的行计数。

  • 内存授予反馈 - SQL Server 根据统计信息中的行计数估值,在查询的初始计划中生成内存授予。 严重的数据倾斜可能导致行计数的高估或低估,这可能会导致内存过度授予而减少并发性,或者导致内存授予不足而使查询将数据溢出到 tempdb。 借助内存授予反馈,SQL Server 可以检测到这些情况,并减少或增加授予查询的内存量,以避免溢出或过度分配。

这些功能均在兼容性模式 150 下自动启用,并且无需进行任何其他更改即可启用。

表变量延迟编译

与 MSTVF 一样,SQL Server 执行计划中的表变量带有一个行的固定行计数估值。 与 MSTVF 一样,当变量的行计数比预期计数大得多时,这个固定估值会导致性能不佳。 在 SQL Server 2019 中,现在会分析表变量并获得实际的行计数。 延迟编译本质上与 MSTVF 的交错执行类似,只不过它是在第一次编译查询时执行,而不是在执行计划内动态执行。

行存储中的批处理模式

批处理执行模式允许批量处理数据,而不是逐行处理数据。 针对计算和聚合产生大量 CPU 成本的查询将从这种处理模型中获得最大的好处。 通过将批处理和列存储索引分开,更多工作负荷可以从批处理模式中获益。

标量用户定义函数内联

在旧版 SQL Server 中,标量函数的性能不佳有几个原因。 标量函数以迭代方式执行,一次有效地处理一行。 它们在执行计划中没有适当的成本估算,并且在查询计划中不允许并行化。 借助用户定义函数内联,这些函数将转换为标量子查询,而不是执行计划中的用户定义函数运算符。 对于涉及标量函数调用的查询,这种转换可以显著提升性能。

非重复近似计数

常见的数据仓库查询模式是执行订单或用户的非重复计数。 对于大型表,这种查询模式可能会耗费大量资源。 非重复近似计数引入了一种更快捷的方法,即通过对行进行分组来收集非重复计数。 此功能可保证 2% 的错误率和 97% 的置信区间。