SQL Server:当过滤器值超出索引直方图范围时,使用错误的索引

时间:2012-10-04 06:55:57

标签: sql-server database histogram query-performance

我们有一个非常大的表,每天有1-2百万行被添加到表中。

在此查询中:

SELECT jobid, exitstatus 
FROM jobsData 
WHERE finishtime >= {ts '2012-10-04 03:19:26'} AND task = 't1_345345_454' 
GROUP BY jobid, exitstatus 

TaskFinishTime都存在索引。

我们预计会使用task索引,因为它的行数要少得多。我们看到的问题是SQL Server创建了一个错误的查询执行计划,该计划使用FinishTime索引而不是任务,并且查询需要很长时间。

当完成时间值超出FinishTime索引直方图时,会发生这种情况。

每天/几小时更新统计信息,但仍有许多情况下查询是针对最近的值。

问题:在这种情况下,我们可以在估计的执行计划中清楚地看到FinishTime的估计行数为1,因此选择了FinishTime索引。为什么SQL Server假定如果没有数据,这是1?有没有办法告诉它使用更合理的东西?

当我们用较早的一个替换日期时,直方图中存在统计数据,估计的行数为~7000

1 个答案:

答案 0 :(得分:4)

您可以使用Plan Guide指示优化程序为您使用特定的查询计划。这非常适合您无法修改以添加提示的生成查询。