这是模式:
据我所知,对于 SQL 优化器来说,这是太复杂的 sql:
SELECT * FROM
(
select pp.Id as PaymentPartId, b.Id as BudgetId, grouping(bp.ID) as g1 , sum(pp.Amount) PaymentsSum, sum(bp.Amount) BudgetSum
from Projects pr
inner join Payments p ON pr.Id = p.ProjectID
inner join PaymentParts pp ON p.Id = pp.PaymentId
inner join Budgets b ON pr.Id = b.ProjectID
inner join Budgetparts bp ON b.Id = bp.BudgetId
group by pp.Id, b.Id, rollup(bp.ID)
) x
WHERE x.PaymentPartId = 777
SQLFIDDLE:http://sqlfiddle.com/#!6/aa74e/11 (使用自动生成的数据)
我期望的是:执行计划应该包含对 x.PaymentPartId 的索引查找。为什么?因为这个查询等同于:
select pp.Id as PaymentPartId, b.Id as BudgetId, grouping(bp.ID) as g1, sum(pp.Amount) PaymentsSum, sum(bp.Amount) BudgetSum
from Projects pr
inner join Payments p ON pr.Id = p.ProjectID
inner join PaymentParts pp ON p.Id = pp.PaymentId
inner join Budgets b ON pr.Id = b.ProjectID
inner join Budgetparts bp ON b.Id = bp.BudgetId
WHERE pp.Id = 777
group by pp.Id, b.Id, rollup(bp.ID)
...最后一个查询使用索引查找。
但是 SQL Optimizer 不仅拒绝使用索引而且忽略所有提示(我建议你使用 sqlfiddle 到期 - 这真的很有趣)。
所以问题是:强制 SQL Server 优化器在那里使用索引查找是不可能的吗? rollup 似乎将 sql 优化器“优化框架”分成两部分并且无法优化整个查询。
P.S. 对于那些投票赞成关闭此“非编程问题”的人:尝试放置优化器提示(sqlfiddle 已准备好测试您的编程技能!)。
最佳答案
Why hints doesn't work? - Roman Pokrovskij
它在文档中: http://technet.microsoft.com/en-us/library/ms181714.aspx
查询提示只能在顶级查询中指定,不能在子查询中指定
关于sql-server - 查询优化器无法将谓词推过汇总?提示也不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21988550/