SQL Server 2008:执行计划取决于日期参数



我有一个SQL查询,其执行计划取决于我提供的DateTime参数。我知道,如果我有这样的情况:

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参数如何影响为查询选择哪个执行计划?

编辑:很明显,原因是我在Date上有一个额外的索引,这只会混淆SQL Server。删除该索引后,一切如预期。但是谢谢你的想法。我没有提供足够的细节让你弄清楚。索引太多从来都不是好事!

SQL Server保留表内容的统计信息,并基于这些统计信息构建查询计划。

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

统计模型的一个问题是"过时的统计数据"。只要更改了超过表的某个百分比或超过500条记录(数据基数的20%),SQL Server就会执行"自动更新统计信息"。(参见本文)。

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

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

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

否则您的表可能会被分区?

如果这两个都不起作用,我需要更多的信息来提出任何进一步的建议。

最新更新