【发布时间】:2016-12-19 01:41:21
【问题描述】:
我有一个在某些情况下运行的查询,它的执行计划“过于简单”,但实际上速度很慢(3-5 秒)。查询是:
SELECT DISTINCT Salesperson.*
FROM Salesperson
INNER JOIN SalesOrder on Salesperson.Id = SalesOrder.SalespersonId
INNER JOIN PrelimOrder on SalesOrder.Id = PrelimOrder.OrderId
INNER JOIN PrelimOrderStatus on PrelimOrder.CurrentStatusId = PrelimOrderStatus.Id
INNER JOIN PrelimOrderStatusType on PrelimOrderStatus.StatusTypeId = PrelimOrderStatusType.Id
WHERE
PrelimOrderStatusType.StatusTypeCode = 'Draft'
AND Salesperson.EndDate IS NULL
缓慢的执行计划看起来像:
立即脱颖而出的是实际行数/执行数显着高于各自的估计值:
如果我删除 Salesperson.EndDate IS NULL 子句,则运行更快的并行执行计划:
如果我删除 DISTINCT 关键字,类似的执行计划也会运行得非常快。
据我所知,优化器似乎根据其不正确的估计决定查询的运行成本不会很高,因此不选择并行计划。但我一生都无法弄清楚为什么它选择了不正确的计划。我检查了我的统计数据,它们都是应有的。我已经在 SQL Server 2008 到 2016 中进行了测试,结果相同。
【问题讨论】:
-
@BrockAdams 完全忘记了这些,抱歉 ^_^ 感谢提醒
标签: sql sql-server query-optimization sql-execution-plan query-performance