1

我们有一个非常大的表,每天有 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 

Task和都存在索引FinishTime

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

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

统计信息每天/几个小时更新一次,但仍有很多情况是查询最近的值。

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

当我们用更早的日期替换日期时,直方图中存在统计信息,估计的行数约为 7000

4

1 回答 1

4

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

于 2012-10-04T08:57:01.013 回答