2012-02-28 49 views
2

我有一个SQL查询,其执行计划取决于我提供的DateTime参数。我明白,如果我有这样一个条件:SQL Server 2008:执行计划取决于日期参数

WHERE Date > '2012-02-28' AND Date < '2012-01-01' 

则执行计划将只是一个恒定的评价,因为没有结果返回。但在其他情况下,我会得到不同的执行计划,这对我来说没有任何意义。例如有条件:

WHERE Date >= '2012-02-01 00:00:00' AND Date <= '2012-02-02 22:00:00' 

该查询使用我添加并优化的索引。但如果我将条件更改为:

WHERE Date >= '2012-02-27 00:00:00' AND Date <= '2012-02-27 22:00:00' 

它不再使用索引。

在运行查询之前,我重建了此表上的所有索引。我在这找不到任何逻辑。所以我的问题是:DateTime参数如何影响为查询选择哪个执行计划?

编辑:显然,原因是我有一个额外的索引在日期只困惑的SQL Server。删除索引后,所有内容都按预期工作。但是,谢谢你的想法。我没有提供足够的细节让你弄清楚。索引太多从来都不好!

回答

1

SQL Server对表内容进行统计并根据这些统计信息构建查询计划。

例如。当我有一张包含100万条记录的表,其中900.000条记录介于2012-02-27和2012-02-28之间时,查询管理器将执行表扫描以读取数据。如果只有10%的数据具有这两个值之间的日期,则它将倾向于使用您创建的索引。

统计模型的一个问题是“过时统计”。无论何时超过一定百分比的表或超过500条记录+(数据基数的20%)都被更改,SQL Server将执行“自动更新统计”。 (see this article)。

因此,如果您的统计数据过期,SQL Server可能会提出不正确的查询计划。

1

您的索引可能被过滤,这将导致它仅用于某些查询。你可以看一下索引定义,以确定此

http://blog.sqlauthority.com/2008/09/01/sql-server-2008-introduction-to-filtered-index-improve-performance-with-filtered-index/

否则,你的表可能被划分?

如果这些都没有帮助,我需要更多的信息来提出进一步的建议。

+0

感谢您的想法(我甚至不知道过滤索引存在)。该索引未被过滤,表未分区。查询计划似乎取决于统计数据。 – 2012-02-28 14:12:24