这是一个模式:
据我所知,对于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)
...and最后一个查询使用索引查找。
但是SQL优化器不仅拒绝使用索引,而且忽略所有提示(我建议您使用sqlfiddle来解释--这真的很有趣)。
所以问题是:是对的吗?不可能强迫Server优化器使用索引搜索?似乎是将SQL优化器的“优化框架”分割成两个部分,从而使优化整个查询变得不可能。
P.S.给那些投票赞成结束这个“非编程问题”的人:尝试添加优化器提示(sqlfiddle已经准备好测试您的编程技能了!)
发布于 2014-03-07 15:05:21
为什么暗示不起作用?-罗曼·波克罗夫斯基
它在文档中:http://technet.microsoft.com/en-us/library/ms181714.aspx
查询提示只能在顶级查询中指定,而不能在子查询中指定。
https://stackoverflow.com/questions/21988550
复制相似问题