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

标签 sql-server sql-server-2012 query-optimization query-hints

这是模式:

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/

相关文章:

SQL Server - CASE FN(str) WHEN x THEN y ELSE 保留原始值而不重复函数

mysql - 使用内部子查询优化此 MySQL 查询

java - 比较java中的sql查询结果集

mysql - 如何使用group by实现串联

c# - 用于构建 OCA 的工具(偶尔连接的应用程序)

sql-server - 如何对全文索引表进行前缀和后缀搜索

sql - 查询从年初开始每周的总计

sql - 与字符串相比,Mysql 在where 子句中使用数字是否更快?

Mysql Count查询优化

c# - 将linq中的字符串转换为int到大数据库上的实体