SQL Server 2022为不断增长的智能查询处理 (IQP) 系列引入了一些新成员。这些添加的范围从扩展和改进各种查询性能反馈机制到添加两个新功能——参数敏感计划 (PSP) 和优化计划强制。在此博客中,我们对这些新增功能进行了总体概述,随后将详细介绍特定功能的博客。
反馈功能
SQL Server 2022 引入了两个新的查询计划反馈功能:并行度反馈和基数估计反馈,并改进了现有反馈功能:内存授予反馈的整体体验。
内存授予反馈
内存授予反馈是 SQL Server 2017 中引入的一项功能。它查看查询的执行情况并确定查询使用的内存是否比授予的内存多(溢出到磁盘),或者它使用的内存是否比原来少授予(可能限制吞吐量潜力)。由于多次执行查询,系统会了解查询通常使用的内存量,并根据先前执行的需要调整授权。在此版本中,我们以两种重要方式改进了内存授予反馈:
-
计划反馈现在保存在磁盘上。这意味着在缓存逐出和服务器重新启动时会保留反馈。
-
我们改进了生成反馈的算法,以便在建议之前查看更多查询历史记录。这可以防止以前在计划具有广泛波动的内存需求时发生的问题(如可能在参数敏感计划中看到的那样)。
因此,用户可以在更广泛的场景中从内存授予反馈中受益,而无需在重新启动、故障转移或计划缓存驱逐后重新学习任何反馈。
并行度反馈
SQL Server 长期以来一直允许用户为服务器或单个查询指定最大并行度 (DOP)。但是,为工作负载中的每个查询微调性能最高的 DOP 可能既费时又费力,而且在某些情况下,如果不对工作负载进行底层代码更改,就不容易实现。在 SQL Server 2022 中,DOP 反馈可以检测降低查询 DOP 的机会。DOP 反馈逐步减少 DOP,直到查询以优化 CPU 使用率和查询性能的并行度运行。
许多客户没有时间或专业知识来为每个单独的查询单独定制并行度。DOP 反馈会自动执行此操作 - 减少 CPU 和整体查询时间,同时仍然利用适用于每个单独查询的最大 DOP。
基数估计反馈
基数估计 (CE) 是 SQL Server 用来确定查询计划的特定部分可能返回多少行的过程。这个过程结合了一组基本假设——称为模型——来产生估计。但是,最适合一个查询的基本假设集可能不适用于不同的查询。在以前的 SQL Server 版本中,客户只使用一种基准 CE 模型,这意味着总有一些查询表现良好,而另一些则表现较差,但使用不同的模型会表现得更好。有一些方法可以手动调整模型,但它们需要更改代码以及深入的技术调查。但是,在 SQL Server 2022 中,我们现在可以以特定于单个查询的方式微调 CE 模型。这表示,如果您有一个工作负载,其中一些查询在一组模型假设下表现最佳,而其他查询在一组不同的假设下表现最佳,则 CE 反馈可以自动调整所有查询,以便为工作负载中的每个查询提供最佳模型。这是以无害的自动化方式完成的。
用户不再需要将他们的工作负载限制在单个 CE 模型上。用户不再需要针对性能不佳的查询手动调整 CE 模型。CE 反馈将根据每个查询自动选择可用于查询的最佳 CE 模型,无需任何人工干预。
参数敏感计划 (PSP) 优化
SQL Server 在 Transact-SQL 语句中使用参数或参数标记来提高其将新 Transact-SQL 语句与现有的、以前编译的执行计划相匹配的能力,并促进计划重用。此过程也称为“参数嗅探”。这是 SQL Server 用来在查询编译期间“嗅探”当前参数值并将这些参数传递给查询优化器的技术,以便可以使用“嗅探”的参数值来生成更有效的查询计划。在很多情况下,此过程运行良好,但有时可能会出错。当对给定一组实际参数的查询有效的查询计划可能对不同的参数集无效时,参数嗅探(也称为参数敏感性)问题开始出现。例如:
- 您使用一个或多个参数化谓词执行查询。
- 在查询编译期间,查询优化器根据编译时参数值生成查询执行计划。然后缓存该计划并用于后续执行。
- 您或其他人执行相同的参数化查询,但这次使用不同的运行时参数值。那些谓词对那些运行时参数值的选择性可能与基于先前编译该计划时的编译时间参数值的估计选择性完全不同。编译的计划对于某些参数值可能不是最优的,从而导致性能受到影响。
当一个或多个表中的数据分布不均匀(也称为数据倾斜)时,通常会发生这种情况。参数嗅探问题可能还有许多其他因素,例如优化器在编译时未知的变量值、代码分支等。
在较高级别上,SQL Server 服务器假定在任何给定时间点都有一个查询的最佳计划。例如,如果表中有足够的数据更改,或者列统计信息得到更新并发生剧烈变化,或者有人只是重新编译查询,则该计划可能会随着时间而改变。但是,假设保持不变;计划缓存会将每个查询映射到一个计划。参数敏感计划优化 (PSP) 功能开始释放 SQL Server 为查询同时缓存两个或多个计划的能力,每个计划对于参数空间的子集都是最优的。PSP 优化使用列级统计数据的直方图来识别数据的任何非均匀分布,这确实是力量所在,因为我们试图优化的是制定一个与定义的谓词基数范围或“桶”更加一致的计划。” 这种对齐使得能够根据数据分布创建不同的优化查询计划。例如,在一个虚构的房地产代理机构中,假设我们有一个名为 PropertySearchByAgent 的表。该表用于跟踪房地产经纪人和每个经纪人的房源数量。如果我们想查看 AgentId 1 的所有列表,我们可以使用参数化查询,例如:在一个虚构的房地产中介中,假设我们有一个名为 PropertySearchByAgent 的表。该表用于跟踪房地产经纪人和每个经纪人的房源数量。如果我们想查看 AgentId 1 的所有列表,我们可以使用参数化查询,例如:在一个虚构的房地产中介中,假设我们有一个名为 PropertySearchByAgent 的表。该表用于跟踪房地产经纪人和每个经纪人的房源数量。如果我们想查看 AgentId 1 的所有列表,我们可以使用参数化查询,例如:
sp_executesql N’``SELECT
*
FROM
PropertySearchByAgent
WHERE
AgentId = @AgentId’, N’@AgentId inst’, 1
PSP 优化将基于此查询的谓词WHERE AgentID 等于某个值,以及谓词的运行时基数,确定它将“分桶”并创建单独的查询(称为查询变体)以执行和缓存在计划缓存。通过使用映射回原始参数化查询的不同查询变体,PSP 优化可以为给定查询创建多个计划。如果我们想查询 ProperySearchByAgent 表以获取有关 AgentID 3 的信息,可以使用之前使用的相同参数化查询,但这次使用不同的参数值 3。由于 Agent 3 的列表比 Agent 1 多,因此 PSP 优化将生成一个不同的计划,该计划对于代理 3 所拥有的列表数量更为优化。
因此,SQL Server 中最常见的性能挑战之一离完全解决又近了一步。这是一项基础功能,将为关键任务工作负载带来巨大的好处,并且是基础性的,并将随着时间的推移而不断改进。
优化计划强制
查询优化和编译是一个快速生成“足够好”的查询执行计划的多阶段过程。查询执行时间包括编译查询所需的时间。这有时会占整个查询执行时间的很大一部分,并消耗大量系统资源(例如 CPU 和内存)。为了减少重复查询的编译开销,SQL Server 缓存查询计划以供重复使用。但是,由于内存压力或 SQL Server 重新启动,计划可能会从缓存中逐出。这可能导致对先前缓存的查询的后续调用需要新的完整编译周期。优化计划强制,
- 什么是优化计划强制? 优化计划强制(或优化回放)是 IQP 系列的新成员,其目标是加快重复强制查询的查询优化过程。
- 为什么会有人使用它? 在某些情况下,数据库可能会占用大量资源来处理传入的编译请求(例如,在故障转移之后)。为了减少数据库服务器的压力,优化计划强制可以是一种有效的工具。
- 优化计划强制有何帮助? 优化计划强制会在执行查询时记录编译过程的历史,以便将来使用它来加速优化过程。它通过记录“优化重放脚本”(ORS)来实现这一点,该脚本是优化过程中应用的有用规则的紧凑表示。有用的规则是那些有助于生成成为最终计划一部分的表达式的规则。
优化回放 (OR) 包括两个阶段——捕获和回放。捕获阶段记录基于启发式的规则的紧凑历史记录,这些规则被确定为在优化过程中有用,并将它们存储在查询存储中 sys.query_store_plan 表的 Showplan XML 属性中。我们将此记录称为优化回放脚本 (ORS)。捕获 ORS 后,您通常必须将查询计划标记为“强制”。如果在数据库上启用了自动计划更正功能,计划也可以自动强制执行。一旦计划被标记为“强制”并且该计划有一个 ORS 并且该计划尚未在计划缓存中,我们就开始“重播”阶段。重播阶段发生在捕获的查询的后续执行期间。如果满足优化重放要求,
结论
总之,IQP 系列的这五项新增或改进继续解决客户在性能方面可能遇到的一些最常见的痛点。反馈系列功能在每个查询的基础上调整查询性能,旨在减少性能不佳的偏移。PSP优化解决了长期以来一直困扰客户的问题,优化计划强制加快了用户强制计划时的编译步骤。这些功能中的每一个单独使用都可以改善一些痛点或挑战——但最好的部分是所有这些功能都可以无缝地结合使用。在多个维度上改进单个查询。我们很自豪地发布了 SQL Server 2022 中智能查询处理的这些新增功能。
原文标题:Intelligent Query Processing: feature family additions
原文作者:Derek Wilson、Kate Smith
原文地址:https://cloudblogs.microsoft.com/sqlserver/2022/09/15/intelligent-query-processing-feature-family-additions/