我有一种我无法理解的情况。我的SQL Server执行计划告诉我,表上缺少统计信息,但是统计信息已经创建:



但是如果我们查看表,我们将看到有一个自动创建的统计信息:



有人可以帮助理解它的状态吗?

Auto_Update和Auto_Create当前数据库上的统计信息已打开。

我正在使用SQL Server2014。

#1 楼

该警告并不总是与缺少的单列统计信息相对应。

没有一种简单的方法可以准确地确定优化器一直在寻找并在所有情况下都找不到的确切统计信息,但是几乎总是一个多列统计信息,它将在查询中的多个相等谓词之间提供一些相关信息。

在您的情况下,可能与警告出现后的扫描之后的过滤器中的谓词完全对应。 />
如果SQL Server报告所有列的“丢失统计信息”警告会很好,但是不幸的是,今天这不是它的工作方式。

进行了一定数量的试验和-error可能是必要的,以标识需要创建以删除警告的多列统计信息。请注意,不能自动创建多列统计信息。尽管有警告,但即使提供了缺少的统计信息,您也可能不会发现估计的质量会提高。

#2 楼

由于似乎很明显已经有特定列的统计信息,因此我提供了两种可能性:


对象资源管理器指向另一个数据库-我很怀疑,因为该数据库中存在DEV名称,因此在一种情况下您正在查看开发人员而在另一种情况下您可能不在。
所使用的计划是从创建统计信息之前开始的(该统计信息是较早生成的,或者不太可能生成,

请验证是否简单答案(1)不是问题,然后尝试使用OPTION (RECOMPILE)发出相同查询以确认或排除该问题。 (2)。

评论


亚伦·贝特南(Aaron Bertnand),非常感谢您的答复。但是对象资源管理器指向当前的数据库,添加OPTION(RECOMPILE)不能解决问题。我还想补充一点,我的查询正在执行存储过程。

– Artashes Khachatryan
15年5月27日在7:34



#3 楼

我刚刚注意到,当您收到有关统计信息的警告时,
如果使用以下设置运行查询或过程:

SET SHOWPLAN_ALL ON




您可以查看缺少的统计信息:



,并在此处使用脚本查看当前的统计信息,以及如果缺少,可以添加它们。