我有一张非常大的桌子,里面有很多行和很多列(我知道这很糟糕,但让我们把它放在一边)。
具体来说,我有两列 - FinishTime, JobId
. 第一个是行的完成时间,第二个是它的 id(不是唯一的,但几乎是唯一的 - 只有少数记录具有相同的 id)。
我有关于 jobid 的索引和关于完成时间的索引。
我们一直在插入行,主要按完成时间排序。我们还会定期更新每个索引的统计信息。
现在解决问题:
当我使用过滤器运行查询时jobid==<some id> AND finishtime > <now minus 1 hour>
-此查询需要很多时间,并且在显示估计的执行计划时,我看到该计划是遍历finishtime
索引,即使遍历jobid
索引应该会好得多。在查看索引统计信息时,我看到服务器“认为”最后一小时的作业数为 1,因为我们没有更新此索引的统计信息。
当我使用过滤器运行查询时jobid==<some id> AND finishtime > <now minus 100 days>
- 这很好用,因为 SQL Server 知道要检查正确的索引 - 作业 ID 索引。
所以基本上我的问题是为什么如果我们不一直更新索引统计信息(这很耗时),服务器会假设最后一个桶之后的记录数是 1?
非常感谢