【问题标题】:SQL Server 2008: execution plan depends on date parametersSQL Server 2008:执行计划取决于日期参数
【发布时间】:2012-02-28 08:35:52
【问题描述】:

我有一个 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 sql-server-2008 sql-execution-plan


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 感谢您的想法(我什至不知道过滤索引存在)。索引未过滤,表未分区。查询计划似乎取决于统计数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多