我有一个查询,它在某些情况下使用“过于简化”的执行计划运行,实际上相当慢(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中进行了测试,结果完全相同。
https://stackoverflow.com/questions/41214750
复制相似问题