介绍一个SQL Server 2016后新增的功能:查询存储。查询存储的工作原理类似于飞行数据记录器或者黑匣子,不断地收集与查询和计划相关的编译和运行时信息,包括已执行查询的历史记录,查询运行时执行统计信息,针对执行计划的执行计划等。与查询相关的数据将永久保存在内部表中,并通过一组视图向用户显示。通过这些信息,可以快速查找性能差异,识别由查询计划更改和故障排除引起的性能等等问题。
通过以下命令或者SSMS界面进行开启
ALTER DATABASE [Databaseone] SET QUERY_STORE = ON;
查询存储开启前
查询存储开启后
查询存储开启后
官方对内部对应的一些表,详细描述如下
查看 |
说明 |
sys.query_store_query_text |
提供对数据库执行的唯一查询文本。 将忽略查询文本之前和之后的注释和空格。 不忽略文本内部的注释和空格。 批中每个语句都会生成单独的查询文本项。 |
sys.query_context_settings |
显示执行查询所依据的影响计划的设置的非重复组合。 由于 context_settings_id 是查询键的一部分,因此采用影响计划的不同设置执行的相同查询文本将在查询存储中生成单独的查询条目。 |
sys.query_store_query |
在查询存储中单独进行跟踪和强制执行的查询条目。 如果查询文本在不同的上下文设置下执行,或在不同的 Transact-SQL 模块(例如,存储过程和触发器等)内外执行,则可以产生多个查询条目。 |
sys.query_store_plan |
显示具有编译时间统计信息的查询估计计划。 存储计划相当于一个可以通过使用 SET SHOWPLAN_XML ON 获取的计划。 |
sys.query_store_runtime_stats_interval |
查询存储将时间划分为自动生成的时间窗口(间隔),并根据每个执行计划的间隔存储聚合的统计信息。 间隔大小由(位于 Management Studio 中)的配置选项“统计信息收集间隔”或由使用 ALTER DATABASE SET Options (Transact-SQL) 的 INTERVAL_LENGTH_MINUTES 进行控制。 |
sys.query_store_runtime_stats |
执行计划的聚合运行时统计信息。 所有捕获的指标都以 4 种统计函数的形式表示:平均值、最小值、最大值、标准偏差。 |
当然,这种类似的节点信息收集的东西,其实并不适合查询频率过大的查询,经过非严谨测试,性能损耗大概在5%左右。
做过DB性能优化的人应该都知道,以前我们要么通过持续性的日志记录分析,要么通过实时的监控去找到对应的性能瓶颈,包括CPU、内存、IO等,查询存储其实就是在此基础上更进一步,把我们关心的点都存储起来,并且有更详尽信息和标准分析报告,相当省事。
具体可以查看官方文档学习学习。