3

這是架構:查詢優化器無法將謂詞過去彙總?提示不也行

enter image description here

而且這是我的理解是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) 

...而最後一個查詢使用索引查找。

但SQL Optimizer不僅拒絕使用索引,而且忽略所有提示(我建議您使用sqlfiddle來終止 - 這真的很有趣)。

所以問題是:我是正確的,它不可能強制SQL Server Optimizer使用索引查找嗎?看起來rollup是將sql優化器「優化框架」分成兩部分的東西,它使優化整個查詢成爲不可能。

P.S.對於那些投票結束這個「非編程問題」的人:嘗試提出優化器提示(sqlfiddle已準備好測試你的編程技巧!)。

+0

不,這是不等價。 –

+0

你爲什麼這麼想?它返回相同的結果。你可以爲了確保... –

+0

也許他們是等價的,不知道跑設置除了操作\t,不能今天上午圍繞讓我的頭'ROLLUP'。但爲什麼你不使用第二個查詢? –

回答