查询存储是SQL Server中最强大的数据库范围功能之一,用于故障排除性能和提高数据库工作负载的稳定性。
SQL Server 2016首次提供了查询存储功能,使数据库管理员(DBA)能够深入了解查询计划选择以及这些选择对SQL Server性能的影响。
在SQL Server 2022中,所有新创建的SQL Server数据库现在都默认启用了查询存储,以帮助客户更好地跟踪性能历史记录,解决与查询计划相关的问题,并启用新的查询处理器功能,我们将在随后的SQL Server 2024博客系列中介绍这些功能。
启用后,查询存储将异步捕获查询、计划和运行时统计信息的历史记录,并在数据库范围内持久化这些数据。这意味着,当您将数据库迁移到另一版本的SQL Server、迁移到不同的硬件,甚至将数据库迁移至云时,您可以检查性能差异,直至查询计划级别。
查询存储通过按时间窗口分离性能数据来实现这一点,这样DBA可以识别使用模式并了解查询计划何时在服务器上发生更改。
如果应用程序开始出现性能问题,这种问题可能会出现在许多场景中,例如高使用率、迁移后,尤其是当数据分布发生变化时,查询存储提供了一种方法来强制查询将使用哪个计划。控制查询将使用哪些计划的能力使响应错误的查询计划变得更加容易,并为数据库管理员提供了升级到SQL Server的更高版本、更改数据库兼容性级别以及自信地将数据库应用程序迁移到云的保证。
对于所有这些场景,查询存储让DBA有信心,他们可以轻松监控数据库应用程序的性能,并在需要时快速响应性能问题。
查询存储可用于SQL Server、Azure SQL数据库、Azure SQL托管实例和Azure Synapse Analytics。在Azure SQL数据库中,查询存储被称为查询性能洞察,并在查询性能洞见导航刀片上进行管理。
Azure SQL数据库中的查询性能洞察
虽然SQL Server默认启用查询存储是一种新的场景,但Azure SQL数据库(包括弹性池)和Azure SQL托管实例数据库的查询存储已默认启用一段时间,此功能已扩展到SQL Server 2022。自SQL Server 2016首次提供查询存储以来,它一直是一项流行功能,现在在SQL Server 2022中,我们正在利用查询存储的能力来持久化查询计划历史记录和运行状况,以启用新功能。SQL Server 2022中的查询存储通过启用诸如查询存储提示、基数估计(CE)反馈、并行度(DOP)反馈、内存授权反馈(MGF)持久性和优化计划强制等功能来扩展查询处理器的能力。查询存储异步记录数据库应用程序性能数据的能力使SQL Server 2022具备了这些新功能。虽然我们默认为SQL Server 2022中所有新创建的数据库启用查询存储,但重要的是要注意,对于已从其他SQL Server实例还原的所有数据库以及从就地升级升级到SQL Server 2021的数据库,无论是否启用了查询存储,这些数据库都将保留以前的查询存储设置。作为迁移后的步骤,对于从以前的SQL Server实例还原的数据库,建议启用查询存储并单独评估数据库兼容性级别设置,因为某些智能查询处理功能是由兼容性级别设置启用的。
注意:为了获得最佳SQL Server性能和迁移运行状况,建议严格遵循《迁移后验证和优化指南》中提供的建议。
查询存储开销
如上所述,自2016年以来,Azure SQL数据库和Azure SQL托管实例中的查询存储已可用;此外,我们在最近几个版本的SQL Server中改进了查询存储性能,通过SQL Server 2019中的累积更新,许多改进都浮出水面。
通过累积更新引入的查询存储改进
Microsoft通过SQL Server 2019中的多个累积更新,使用Query Store改进了临时工作负载。
影响查询存储运行状况的最相关累积更新包括:
-
KB5000642 SQL Server 2019的累积更新9:修复了特定工作负载的查询存储可伸缩性改进。
-
KB4577194 SQL Server 2019的累积更新8:针对特定工作负载的查询存储可扩展性改进。查询存储现在对其可以使用的内存量施加了内部限制,并自动将操作模式更改为只读,直到足够的内存返回到数据库引擎,从而防止性能问题。
-
KB4563110 SQL Server 2019的累积更新6:此改进可以通过指定ALTER DB命令中强制的附加选项来强制关闭查询存储选项。强制选项允许您通过中止所有后台任务立即关闭查询存储。ALTER DATABASE{0}设置QUERY_STORE=OFF(强制)
注意:始终建议评估组织正在维护的SQL Server版本的最新累积更新,以确保数据库应用程序环境的最佳性能和稳定性。
查询存储设置改进
除了我们通过SQL Server 2019中的累积更新引入的稳定性改进之外,还对查询存储默认行为进行了优化,以减少捕获的查询存储详细信息的数量,同时增加可保留的查询存储历史记录的数量。
SQL Server 2019中引入的设置更改已经进行,将提高查询存储行为的性能,同时仍优化查询存储的功能,既可以用作“飞行数据记录器”,也可以使查询处理器能够利用SQL Server 2022中的新功能。
为了提高查询存储设置的性能,捕获模式已从“全部”更改为“自动”,最大大小(MB)已从100 MB更改为1024 MB。
在自动捕获模式设置下,我们现在在达到以下任何阈值时捕获查询存储详细信息:
-
1秒=任何编译
-
100毫秒=执行CPU时间
-
30次执行=执行计数
这些设置有助于进一步减少查询存储可能对SQL Server造成的任何影响,同时仍确保捕获关键数据以进行故障排除,并提供在SQL Server 2022中启用新功能的能力。
自定义捕获策略
为了利用某些SQL Server 2022功能,有必要在默认情况下启用查询存储。
如果仍然担心查询存储可能带来的开销,数据库管理员可以利用自定义捕获策略进一步优化查询存储捕获行为。
自定义捕获策略可用于帮助进一步优化查询存储捕获。可以使用自定义捕获策略来更选择性地捕获哪些查询和查询详细信息。例如,管理员可以选择只捕获最昂贵的查询、重复查询或计算开销较高的查询。
自定义捕获策略可以帮助查询存储捕获工作负载中最重要的查询。
请参见下面的示例ALTER DATABASE脚本,该脚本将为查询存储启用自定义捕获策略:
ALTER DATABASE [QueryStoreDB]
SET QUERY_STORE = ON
(
OPERATION_MODE = READ_WRITE,
CLEANUP_POLICY = ( STALE_QUERY_THRESHOLD_DAYS = 90 ),
DATA_FLUSH_INTERVAL_SECONDS = 900,
MAX_STORAGE_SIZE_MB = 1000,
INTERVAL_LENGTH_MINUTES = 60,
SIZE_BASED_CLEANUP_MODE = AUTO,
MAX_PLANS_PER_QUERY = 200,
WAIT_STATS_CAPTURE_MODE = ON,
QUERY_CAPTURE_MODE = CUSTOM,
QUERY_CAPTURE_POLICY = (
STALE_CAPTURE_POLICY_THRESHOLD = 24 HOURS,
EXECUTION_COUNT = 30,
TOTAL_COMPILE_CPU_TIME_MS = 1000,
TOTAL_EXECUTION_CPU_TIME_MS = 100
) );
注意:除了STALE_CAPTURE_POLICY_THRESHOLD之外,这些选项定义了在定义的STALE CAPTURE策略阈值中捕获查询所需的OR条件。
QUERY_CAPTURE_MODE = CUSTOM,
QUERY_CAPTURE_POLICY = (
STALE_CAPTURE_POLICY_THRESHOLD = 24 HOURS,
EXECUTION_COUNT = 30,
TOTAL_COMPILE_CPU_TIME_MS = 1000,
TOTAL_EXECUTION_CPU_TIME_MS = 100
)
总结
自SQL Server 2016发布以来,SQL Server中的查询存储一直是一项流行的功能,以提供查询存储作为SQL Server的“飞行数据记录器”的功能。查询存储通过收集有关查询性能随时间变化的信息来实现这一点。因此,Query Store具有强大的能力,可以减少数据库管理员响应关键性能事件所需的时间,并帮助简化本地系统(硬件和SQL Server版本)之间的数据库迁移,以及将数据库应用程序迁移到云。
DBA在以下许多场景中使用查询存储:
-
确保数据库升级和迁移的运行状况。
-
发现并解决应用程序性能退化问题。
-
根据资源消耗(运行时间、计算开销、内存、I/O等)调整最昂贵的查询。
-
保持数据库兼容性级别升级之间的性能。
-
以及许多其他查询存储使用场景。
SQL Server 2022现在支持默认启用行为,并引入了查询处理器能够利用历史性能数据的功能。
此功能将查询存储的功能扩展到故障排除和迁移场景之外,并扩展到SQL Server中智能查询处理行为的下一个级别。
原文标题:Query Store is enabled by default in SQL Server 2022
原文作者:David Pless
原文链接:https://cloudblogs.microsoft.com/sqlserver/2022/08/18/query-store-is-enabled-by-default-in-sql-server-2022/




