天天看点

RDS SQL Server - 专题分享 - 巧用执行计划缓存之统计信息缺失警告问题引入场景重现发现问题解决问题最后总结

SQL Server 数据库查询优化器对执行计划成本的评估是基于统计信息的,换句话说,统计信息的准确与否直接关系着查询语句是否能够高效运行。那么,在SQL Server中,表对象中统计信息的缺失是一个影响查询语句性能的风险点,我们如何能够通过非常自动化的方式来侦查,发现统计信息的缺失呢?这个问题的答案就是我们今天这篇文章要分享的内容 - 使用执行计划缓存来发现统计信息的缺失警告。

为了模拟统计信息缺失的场景,我们创建测试数据库,创建测试表,执行查询语句,然后通过执行计划图像化界面发现统计信息缺失警告。

创建测试数据库并且关闭该数据库的自动创建统计信息的选项设置。

创建测试表,并初始化2万条数据。

查询测试,这里请打开实际执行计划选项,方法如下截图:

RDS SQL Server - 专题分享 - 巧用执行计划缓存之统计信息缺失警告问题引入场景重现发现问题解决问题最后总结

或者使用快捷键Ctrl + m,然后执行下面的查询语句。

查询语句执行完毕后,实际执行计划截图如下:

RDS SQL Server - 专题分享 - 巧用执行计划缓存之统计信息缺失警告问题引入场景重现发现问题解决问题最后总结

从执行计划截图,我们可以发现以下规律:

实际行数与预估行数相差甚远:实际满足条件行数为0,而执行计划预估满足条件行数为905,说明统计信息不准确。

统计信息缺失警告:存在WHERE语句中的字段ItemID,UserID缺少统计信息警告。

将执行计划图形化界面生成XML格式,XML格式中的统计信息缺失警告如下截图:

RDS SQL Server - 专题分享 - 巧用执行计划缓存之统计信息缺失警告问题引入场景重现发现问题解决问题最后总结

在“场景重现”小节,我们是通过手动分析执行计划来发现统计信息缺失(我们可以叫手动模式),我们如何实现无人值守,自动侦查,自动发现统计信息缺失呢?我们称之为自动模式。要实现统计信息缺失的自动发现和跟踪,我们可以通过搜索执行计划缓存的方式来实现,代码如下:

执行查询语句的部分结果截图展示如下:

RDS SQL Server - 专题分享 - 巧用执行计划缓存之统计信息缺失警告问题引入场景重现发现问题解决问题最后总结

我们通过自动化的方式来跟踪和发现了统计信息缺失的问题,我们将如何解决这个问题呢?

由于为了场景重现统计信息缺失的目的,在数据库创建完毕后,我们手动关闭了数据库统计信息自动创建的功能,为了解决统计信息缺失的问题,我们需要打开这个选项(当然创建数据库系统默认是自动打开的)。这个选项打开后,SQL Server在发现查询语句有统计信息缺失的情况下,会自动为相应的字段创建统计信息。打开选项的方法如下:

在我们的工作过程中,我们发现在极少情况下,即使自动创建统计信息选项是打开的,也会出现统计信息缺失的情况,在这种场景下,就需要我们根据“发现问题”小节的方法(字段名为Refer_Columns)找到统计信息缺失的字段,手动创建统计信息。比如:

这篇文章分享了如何通过执行计划缓存来查找统计信息缺失的方法,并提出来解决这类问题的途径,从而解决了因为统计信息缺失而导致SQL Server优化器对执行计划评估不准确的风险点,保证数据库系统高效率运行。