使用查询优化助手升级数据库

适用于: SQL Server 2016 (13.x) 及更高版本

从旧版 SQL Server 迁移到 SQL Server 2014(12.x)或更高版本,并将 数据库兼容性级别升级到 最新可用版本时,工作负荷可能会面临性能回归的风险。 从 SQL Server 2014 (12.x) 升级到任何较新版本时,出现此情况的可能性更小。

在 SQL Server 2014(12.x)及更高版本中,所有查询优化器的更改都限制在最新的数据库兼容级别。因此,执行计划不会在升级时立即更改,而是在用户将 COMPATIBILITY_LEVEL 数据库选项更改为最新可用选项时才会更新。 有关 SQL Server 2014(12.x)中引入的查询优化器更改的详细信息,请参阅基数估计(SQL Server)。 要详细了解兼容性级别及其对升级的影响,请参阅兼容性级别和数据库引擎升级

如果升级遵循下图所示的推荐工作流,数据库兼容性级别提供的这种“门控”功能,结合查询存储(查询存储),可让您在升级过程中对查询性能进行高度控制。 有关升级兼容级别的建议工作流的详细信息,请参阅 更改数据库兼容性级别并使用查询存储

使用查询存储(查询存储)的推荐数据库升级工作流示意图。

SQL Server 2017(14.x)进一步改进了对升级的控制,其中引入了 自动优化 ,并允许自动执行建议工作流中的最后一步。

从 SQL Server Management Studio v18 开始, 查询优化助手(QTA) 功能指导用户完成建议的工作流,以在升级到较新的 SQL Server 版本期间保持性能稳定性,如本节中所述, 在升级到较新的 SQL Server的查询存储使用方案期间保持性能稳定性。 不过,QTA 不会回滚到以前已知的优质计划,如建议的工作流的最后一步所示。 相反,QTA 会跟踪 查询存储 回归查询 视图中发现的任何回归,并循环访问适用的优化器模型变体的可能排列,以便可以生成一个新的更好的计划。

重要

QTA 不会生成用户工作负载。 如果在应用程序未使用的环境中运行 QTA,请确保可以通过其他方式在目标 SQL Server 数据库引擎上执行代表性测试工作负载。

查询调优助手工作流程

QTA 的起始点是基于这样一种假设:来自早期版本 SQL Server 的数据库会通过附加数据库RESTORE 语句移动到 SQL Server 数据库引擎的较新版本,并且升级前的数据库兼容级别不会立即更改。 QTA 将引导您完成以下步骤:

  1. 根据用户设置的工作负载持续时间(以天为单位)的建议设置来配置查询存储。 考虑与典型业务周期匹配的工作负载持续时间。

  2. 请求启动所需的工作负载,以便 查询存储 收集工作负载数据基线(如果当前尚无可用基线)。

  3. 升级到用户所选的目标数据库兼容性级别。

  4. 请求收集第 2 次传递的工作负载数据,用于进行比较和回归检测。

  5. 循环访问根据查询存储“回归的查询”视图找到的任何回归,通过收集有关适用优化器模型变体的可能排列的运行时统计信息进行试验,并测量结果

  6. 报告已测得的改进情况,并可选择使用计划指南使这些更改持久生效。

有关附加数据库的详细信息,请参阅数据库分离和附加

下图展示了 QTA 如何仅对前文所述的、使用查询存储(查询存储)升级兼容性级别的推荐工作流的最后几个步骤进行调整。 QTA 提供特定于所选回归查询的优化选项,而不是在当前效率低下的执行计划和最后一个已知良好的执行计划之间进行选择,以使用优化的执行计划创建新的改进状态。

使用 QTA 推荐的数据库升级工作流示意图。

QTA 优化内部搜索空间

QTA 仅面向可以从查询存储中执行的 SELECT 查询。 若编译参数是已知的,那么参数化查询符合条件。 此时,依赖于运行时构造(如临时表或表变量)的查询不符合条件。

QTA 针对因基数估计 (SQL Server) 版本变更而可能导致的已知查询退化模式。 例如,将数据库从 SQL Server 2012 (11.x) 和数据库兼容性级别 110 升级到 SQL Server 2017 (14.x) 和数据库兼容性级别 140 时,某些查询可能会回归,因为它们专门用于处理 SQL Server 2012(11.x) (CE 70)中存在的 CE 版本。 这并不意味着从 CE 140 还原为 CE 70 是唯一选择。 如果只有较新版本中的特定更改引入回归,则可以提示该查询仅使用适用于特定查询的以前 CE 版本的相关部分,同时仍在使用较新的 CE 版本的其他所有改进。 还能使工作负载中未回归的其他查询获益于较新版 CE 的改进。

QTA 搜索的 CE 模式为:

  • 独立与相关性:如果独立假设为特定查询提供更好的估计,则查询提示 USE HINT ('ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES') 会导致 SQL Server 在估算 AND 筛选器谓词以考虑相关性时使用最小选择性来生成执行计划。 有关更多信息,请参阅 USE HINT 查询提示CE 版本

  • 简单包含与基本包含:如果不同的联接包含为特定查询提供了更好的估计,则查询提示 USE HINT ('ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS') 会导致 SQL Server 使用简单包含假设而不是默认的 Base Containment 假设来生成执行计划。 有关详细信息,请参阅 USE HINT 查询提示CE 的版本

  • 多语句表值函数 (MSTVF) 固定基数估计(100 行与 1 行):如果对 TVF 使用默认的 100 行固定估计,生成的计划并不比使用 1 行固定估计(对应于 SQL Server 2008 R2 (10.50.x) 及更早版本中查询优化器 CE 模型的默认值)更高效,则会使用查询提示 QUERYTRACEON 9488 来生成执行计划。 有关 MSTVF 的详细信息,请参阅创建用户定义函数(数据库引擎)

万不得已时,如果狭窄范围的提示不能为符合条件的查询模式带来足够好的结果,也可考虑使用查询提示 USE HINT ('FORCE_LEGACY_CARDINALITY_ESTIMATION') 生成执行计划,从而充分利用 CE 70。

重要

任何提示都会强制某些行为,而这些行为可能会在未来 SQL Server 更新中得到解决。 我们建议,只有在别无选择时才使用提示,并且计划在每次新升级时重新审视使用了提示的代码。 通过强制执行某些行为,可能会导致工作负载无法从较新版本的 SQL Server 中引入的增强功能中受益。

启动用于数据库升级的查询优化助手

QTA 是一种基于会话的功能,它将会话状态存储在首次创建会话的用户数据库的 msqta 架构中。 可在一段时间内在单个数据库上创建多个优化会话,但是任何给定的数据库只能存在一个活动会话。

创建数据库升级会话

  1. 在 SQL Server Management Studio 中,打开对象资源管理器并连接到数据库引擎。

  2. 对于计划升级数据库兼容性级别的数据库,右键单击数据库名称,依次选择“任务”“数据库升级”“新建数据库升级会话”

  3. 在 QTA 向导窗口中,配置会话需要两个步骤:

    1. 设置 窗口中,配置 查询存储 以捕获相当于一个完整业务周期的工作负载数据,用于分析和优化。

      • 以天为单位输入预期的工作负载持续时间(最短为 1 天)。 此功能用于提出推荐的查询存储设置,以便暂时允许收集整个基线数据。 要确保能够分析在更改数据库兼容性级别后找到的任何回归查询,捕获良好的基线至关重要。

      • 完成 QTA 工作流之后,设置用户数据库应处于的预期目标数据库兼容性级别。

      完成后,选择“下一步”

      “新建数据库升级会话设置”窗口的屏幕截图。

    2. “设置” 窗口中,两列显示目标数据库中查询存储的 当前 状态,以及 “建议 ”设置。

      • 默认选择“推荐”设置,但选择“当前”列的单选按钮会接受当前设置,还可以微调当前的查询存储配置。

      • 建议的 过时查询阈值 设置是预期的工作负荷持续时间值的两倍,以天为单位。 这是因为查询存储需要保存有关基线工作负荷和数据库后升级工作负荷的信息。

      完成后,选择“下一步”

      “新建数据库升级设置”窗口的屏幕截图。

      重要

      建议 的最大大小 是一个任意值,可能适合短时间工作负荷。 但是,对于密集型工作负荷,可能不足以保存有关基线和数据库后升级工作负荷的信息,即可能会生成许多不同的计划。 如果您预计会出现这种情况,请输入一个更高且合适的值。

  4. 调整窗口完成会话配置,并说明打开会话并继续进行所需的后续步骤。 完成后,选择“完成”

    “新建数据库升级优化”窗口的屏幕截图。

执行数据库升级工作流

  1. 对于计划升级数据库兼容性级别的数据库,右键单击数据库名称,依次选择“任务”“数据库升级”“监视会话”

  2. 会话管理页面列出当前范围内数据库的当前会话和历史会话。 选择所需会话,然后选择“详细信息”

    注意

    如果当前会话不存在,请选择“刷新”按钮

    列表包含以下信息:

    • 会话 ID

    • 会话名称:系统生成的名称,该名称由数据库名称以及创建会话的日期和时间组成。

    • 状态:会话状态(活动或关闭)。

    • 说明:系统生成的说明,包括用户所选的目标数据库兼容性级别以及业务周期工作负载天数。

    • 开始时间:创建会话的日期和时间。

    QTA 会话管理页的屏幕截图。

    注意

    删除会话:删除为所选会话存储的任何数据。 然而,删除已关闭的会话不会删除之前部署的任何计划指南。 如果您删除了已部署执行计划指南的会话,则无法使用 QTA 进行回滚。 改为使用 sys.plan_guides 系统表搜索计划指南,然后使用 sp_control_plan_guide 手动删除。

  3. 新会话的入口点是“数据收集”步骤

    注意

    会话按钮会返回到会话管理页面,而当前活动会话保持不变。

    此步骤有以下三个子步骤:

    1. 基线数据收集要求用户运行具有代表性的工作负载周期,以便查询存储收集基线。 完成该工作负荷后,请检查 工作负荷运行完成,然后选择 下一步

      注意

      运行工作负载时,可关闭 QTA 窗口。 稍后返回仍处于活动状态的会话时,将从中断的同一步骤继续执行。

      QTA 步骤 2 子步骤 1 的屏幕截图。

    2. 升级数据库 提示将数据库兼容性级别升级到所需目标的权限。 若要继续进行下一个子步骤,请选择“是”

      QTA 步骤 2 子步骤 2 - 升级数据库兼容性级别的屏幕截图。

      下一页确认已成功升级数据库兼容性级别。

      QTA 步骤 2 子步骤 2 的屏幕截图。

    3. 已观察的数据收集请求用户重新运行代表性工作负载周期,以便查询存储能够收集用于发现优化机会的对比基线。 在工作负载执行期间,使用 刷新 按钮持续更新已回归的查询列表(如果找到了此类查询)。 更改“要显示的查询数”值,以限制显示的查询数量。 列表的顺序受 指标(持续时间或 CpuTime)和 聚合方式(默认为平均值)影响。 还需选择要显示的查询数量。 完成该工作负荷后,请检查 工作负荷运行完成,然后选择 下一步

      QTA 步骤 2 子步骤 3 的屏幕截图。

      列表包含以下信息:

      • 查询 ID

      • 查询文本:可选择 ... 按钮展开的 Transact-SQL 语句。

      • 运行次数:显示为整个工作负载收集执行该查询的次数。

      • 基线指标:数据库兼容性升级前基线数据收集所选指标(Duration 或 CpuTime)的值(单位:毫秒)。

      • 观察指标:数据库兼容性升级后数据收集所选指标(Duration 或 CpuTime)的值(单位:毫秒)。

      • 百分比变化:数据库兼容性升级状态前后所选指标的百分比变化。 负数表示查询的测量的回归数量。

      • 可调,取决于该查询是否可用于实验。

  4. 查看分析可选择要试验的查询并查找优化机会。 要显示的查询值将成为可进行试验的符合条件查询范围。 选中所需查询后,选择“下一步”开始试验。

    可调参数设置为 False 的查询无法被选中用于实验。

    重要

    提示建议,一旦 QTA 进入试验阶段,则无法返回到“视图分析”页。 如果在前进到试验阶段之前未选择所有符合条件的查询,需在稍后创建新会话并重复工作流。 这需要将数据库兼容性级别重置回之前的值。

    QTA 步骤 3 的屏幕截图。

  5. 查看结果允许选择将建议的优化作为执行计划指南部署到哪些查询上。

    列表包含以下信息:

    • 查询 ID

    • 查询文本:可选择 ... 按钮展开的 Transact-SQL 语句。

    • 状态:显示查询的当前试验状态。

    • 基准指标:在 步骤 2 子步骤 3 中执行的查询,代表数据库兼容性升级后性能退化的查询。

    • 观察到的指标:在实验后,针对足够有效的建议优化方案,该查询的选定指标(Duration 或 CpuTime)以毫秒为单位。

    • % 变化:指定试验状态之前后选定指标的百分比变化,表示通过建议优化查询所测量到的改进量。

    • 查询选项:链接到改进查询执行指标的建议提示。

    • 可以部署,具体取决于建议的查询优化是否可以作为计划指南进行部署。

    QTA 步骤 4 的屏幕截图。

  6. 验证:显示之前为此会话选定的查询的部署状态。 此页面中的列表与上一页不同之处在于,将 可以部署 列改为 可以回滚 列。 此列可以为TrueFalse,具体取决于是否能够回滚已部署的查询优化并移除其计划指南。

    QTA 步骤 5 的屏幕截图。

    如果日后需要回滚建议的优化方案,请选择相关查询并选择回滚。 删除此查询计划指南并更新列表,以删除已回滚的查询。 请注意,在下图中,已删除查询 8。

    QTA 步骤 5 - 回滚的屏幕截图。

    注意

    删除已关闭的会话不会删除之前部署的任何计划指南。 如果您删除了已部署执行计划指南的会话,则无法使用 QTA 进行回滚。 改为使用 sys.plan_guides 系统表搜索计划指南,然后使用 sp_control_plan_guide 手动删除。

权限

需要具有 db_owner 角色的成员身份。