sql-server - SQL 服务器 : wrong index is used when filter value exceeds the index histogram range

标签 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

最佳答案

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

关于sql-server - SQL 服务器 : wrong index is used when filter value exceeds the index histogram range,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12721838/

相关文章:

sql-server - SQL 重新排序记录

r - SuperImpose 直方图适合一张图 ggplot

gnuplot 直方图误差条问题

mysql - 数据库责任

php - 如何在 phpmyadmin 中创建外键

php - 如何创建一个 SQL 查询,其中我可以使用 WHERE & AND 子句选择一列的最大数量

python - 将直方图箱分配给每个数据点

SQL根据case语句部分更新列?

sql-server - SSRS - 无法确定作业所有者是否具有服务器访问权限 [SQLSTATE 42000](错误 15404))

SQL ANY 作为函数而不是运算符