查询优化器无法推送谓词过去汇总?提示也不起作用

时间:2014-02-24 12:59:50

标签: sql-server sql-server-2012 query-optimization query-hints

这是架构:

enter image description here

这就是我所理解的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已准备好测试您的编程技巧!)。

1 个答案:

答案 0 :(得分:1)

  

为什么提示不起作用? - Roman Pokrovskij

它在文档中: http://technet.microsoft.com/en-us/library/ms181714.aspx

查询提示只能在顶级查询中指定,而不能在子查询中指定