gpt4 book ai didi

sql-server - 查询优化器无法将谓词推过汇总?提示也不起作用

转载 作者:行者123 更新时间:2023-12-02 03:38:13 25 4
gpt4 key购买 nike

这是模式:

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 优化器在那里使用索引查找是不可能的吗? rollup 似乎将 sql 优化器“优化框架”分成两部分并且无法优化整个查询。

P.S. 对于那些投票赞成关闭此“非编程问题”的人:尝试放置优化器提示(sqlfiddle 已准备好测试您的编程技能!)。

最佳答案

Why hints doesn't work? - Roman Pokrovskij

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

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

关于sql-server - 查询优化器无法将谓词推过汇总?提示也不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21988550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com