gpt4 book ai didi

sql - 为什么 SQL Server 不将索引用于非常相似的日期时间查询?

转载 作者:行者123 更新时间:2023-12-05 01:19:09 24 4
gpt4 key购买 nike

我在 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 毫秒,并且驱逐计划显示它使用了主键!

我就是不明白。对于 3667 行和更多行,它始终使用主键,即使查找速度要快得多。

有解释吗?

最佳答案

status未包含在 datetime 上的索引中所以它需要对每个匹配的行进行键查找来检索这个值。

随着范围的增长(以及因此需要的查找次数),它估计仅扫描整个(覆盖)聚集索引避免查找会更快。在您的情况下可能不正确。它从一个计划切换到另一个计划的点称为 the tipping point .

您应该检查估计行数与实际行数是否不正常(也许自上次更新统计信息以来,某些与范围匹配的行已被删除)。

或者,由于碎片化程度高或其他原因,索引扫描可能比成本计算假设的成本更高,costing assumptions made 不反射(reflect)您环境中的实际相对性能。

关于sql - 为什么 SQL Server 不将索引用于非常相似的日期时间查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12846283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com