首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查询优化器不能将谓词推过汇总吗?提示也没用

查询优化器不能将谓词推过汇总吗?提示也没用
EN

Stack Overflow用户
提问于 2014-02-24 12:59:50
回答 1查看 505关注 0票数 3

这是一个模式:

据我所知,对于sql优化器来说,这个SQL太复杂了:

代码语言:javascript
运行
复制
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上的索引查找。为什么?因为此查询等效于:

代码语言:javascript
运行
复制
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)

...and最后一个查询使用索引查找。

但是SQL优化器不仅拒绝使用索引,而且忽略所有提示(我建议您使用sqlfiddle来解释--这真的很有趣)。

所以问题是:是对的吗?不可能强迫Server优化器使用索引搜索?似乎是将SQL优化器的“优化框架”分割成两个部分,从而使优化整个查询变得不可能。

P.S.给那些投票赞成结束这个“非编程问题”的人:尝试添加优化器提示(sqlfiddle已经准备好测试您的编程技能了!)

EN

回答 1

Stack Overflow用户

发布于 2014-03-07 15:05:21

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21988550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档