警告执行计划中缺少统计信息


23

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

警告

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

在此处输入图片说明

有人可以帮助您了解情况如何吗?

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

我正在使用SQL Server 2014。

Answers:


15

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

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

也许在您的情况下,它与警告显示在扫描之后的筛选器中的谓词完全对应。

如果SQL Server报告“缺少统计信息”警告的所有列会很好,但是不幸的是,今天这不是它的工作方式。

可能需要一定程度的反复试验才能确定您需要创建以删除警告的多列统计信息。请注意,无法自动创建多列统计信息。尽管有警告,但即使提供了缺失的统计信息,您也可能不会发现估计的质量会提高。


8

既然很明显已经有特定列的统计信息,所以我提供了两种可能性:

  1. 对象资源管理器指向另一个数据库-我很怀疑,因为该数据库具有DEV名称,所以在一种情况下您正在查看开发程序而在另一种情况下却没有。
  2. 使用的计划是从创建统计信息之前开始的(计划是更早生成的,或者是不太可能在创建统计信息时阻止重新编译触发)。

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


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

2

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

SET SHOWPLAN_ALL ON

在此处输入图片说明

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

在此处输入图片说明

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.