为什么SQL服务器不使用索引非常类似的日期时间查询?(Why is SQL Server not u

2019-09-24 00:06发布

我有SQL Server上的表,大约100万行。 它的ID(PK),一个状态(int)和日期时间列。 此外,我已经创建的日期时间列的索引。

现在我已经找到了一个效果,我不明白。

SELECT status
FROM table
WHERE dateTime BETWEEN '2010-01-01T00:00:00' AND '2010-01-02T12:00:00'

这个语句返回3664行。 它运行约150毫秒和执行计划显示,其做索引与键查找求。

现在,如果我改变如下(只是更改小时12〜13):

SELECT status
FROM table
WHERE dateTime BETWEEN '2010-01-01T00:00:00' AND '2010-01-02T13:00:00'

这个语句返回3667行。 它运行约600毫秒和exuction计划显示,使用主键的!

我只是不明白。 对于它总是使用主键,即使寻求3667个多行的速度要快得多。

是否有一个解释?

Answer 1:

status不包括在该指数datetime ,因此需要为每个匹配的行检索此值做键查找。

作为范围生长(并且因此需要数查找的)它估计,它会更快只是扫描整个(覆盖)聚簇索引避免查找。 可能是不正确的,你的情况。 在它从一个计划切换到另一个的点被称为临界点 。

您应该检查如果估计VS行的实际数量是不正常的(因为更新了统计信息的最后或许会匹配范围内的一些行已经被删除)。

或者,也许索引扫描比成本假设承担更昂贵由于高水平碎片或其他一些原因, 成本假设做出不反映在您的环境中的实际相对性能。



文章来源: Why is SQL Server not using Index for very similar datetime query?