这是架构:
这就是我所理解的SQL对SQL Optimizer来说太复杂了:
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 Optimizer在那里使用索引查找吗?似乎汇总是将sql优化器“优化框架”拆分为两部分的东西并且它使得无法优化整个查询。
P.S。对于那些投票支持关闭这个“非编程问题”的人:尝试提供优化器提示(sqlfiddle已准备好测试您的编程技巧!)。
答案 0 :(得分:1)
为什么提示不起作用? - Roman Pokrovskij
它在文档中: http://technet.microsoft.com/en-us/library/ms181714.aspx
查询提示只能在顶级查询中指定,而不能在子查询中指定