3

这是架构:

在此处输入图像描述

这是据我所知对于 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已准备好测试您的编程技能!)。

4

1 回答 1

1

为什么提示不起作用?- 罗曼·波克罗夫斯基

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

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

于 2014-03-07T15:05:21.273 回答