这是架构:
这是据我所知对于 SQL Optimizer 来说太复杂的 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 Optimizer 在那里使用索引搜索是不可能的,我说得对吗? 似乎汇总是将 sql 优化器“优化框架”拆分为两部分的东西,它使得优化整个查询成为不可能。
PS对于那些投票关闭这个“非编程问题”的人:尝试放置优化器提示(sqlfiddle已准备好测试您的编程技能!)。