SQL Server 2008 : execution plan depends on date parameters

标签 sql sql-server-2008 sql-execution-plan

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

编辑:显然原因是我在日期上有一个附加索引,这使 SQL Server 感到困惑。删除该索引后,一切都按预期进行。但谢谢你的想法。我没有提供足够的细节让你弄清楚。索引太多永远都不好!

最佳答案

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

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

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

因此,如果您的统计信息已过时,SQL Server 很可能会提出不正确的查询计划。

关于SQL Server 2008 : execution plan depends on date parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9478701/

相关文章:

mysql查询浏览器编辑按钮被禁用

sql - Oracle sql 列表

sql - PostgreSQL:LIMIT 越低,查询越慢

performance - PostgreSQL查询速度是可变的

Mysql:尝试获取锁时发现死锁,需要删除 key 吗?

mysql - 根据mysql中时区的当前时间排序

sql-server-2008 - 如果用户输入 "ABCD-EFGH"而不是 "ABCDEFGH",SQL 查询将返回结果

sql - 使用 SQL Server 2008 表中的新值更新 Xml 属性

sql-server - SQL Server 2008 - 插入触发器 : How to add values not in Inserted pseudo table

sql - MySQL解释异常