這是架構:查詢優化器無法將謂詞過去彙總?提示不也行
而且這是我的理解是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已準備好測試你的編程技巧!)。
不,這是不等價。 –
你爲什麼這麼想?它返回相同的結果。你可以爲了確保... –
也許他們是等價的,不知道跑設置除了操作\t,不能今天上午圍繞讓我的頭'ROLLUP'。但爲什麼你不使用第二個查詢? –