0

我有一张非常大的桌子,里面有很多行和很多列(我知道这很糟糕,但让我们把它放在一边)。

具体来说,我有两列 - 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?

非常感谢

4

1 回答 1

1

您可以使用DBCC SHOW_STATISTICS获得统计信息包含的索引的直方图,例如

DBCC SHOW_STATISTICS ( mytablename , myindexname ) 

对于基于日期的记录,查询总是容易出现不正确的统计信息。运行这个应该显示直方图中的最后一个桶在[今天之前/今天之后]的范围内几乎没有任何记录。但是,在所有其他条件相同的情况下,如果两者都是没有包含列的单列索引,SQL Server 仍然应该优先使用job_id索引。finishtime这是因为 job_id (int) 的查找速度比 finishtime (datetime) 快。

注意:如果您finishtime正在覆盖查询,这将严重影响查询优化器选择它,因为它消除了书签查找操作。

为了解决这个问题,要么

  1. 定期更新统计数据
  2. 在数据上创建多个过滤索引(2008+ 功能),其中一个分区更新频率更高
  3. 对敏感查询使用索引提示
于 2012-12-06T06:51:38.173 回答