子查询中的where子句或连接条件之间的区别

时间:2013-05-28 19:17:14

标签: sql performance join subquery

当我比较我自己构建的查询和实体框架构造的查询时,我遇到了一个有趣的问题,这是我在存储过程中进行的查询:

select *
from TableA a
    join (select b.Col2, c.Col3
         from TableB b
            join TableC c on b.Col1=c.Col1
        where b.Col2 in (1,2,3,4)
        ) as bc on a.Col3=bc.Col3

这是由实体框架构建的查询:

select *
from TableA a
    join (select b.Col2, c.Col3
         from TableB b
            join TableC c on b.Col1=c.Col1
    ) as bc on a.Col3=bc.Col3 and bc.Col2 in (1,2,3,4)

我的问题是sql编译器是否足够智能以同样的方式优化查询? (假设索引在加入/ where条件中正确定义。

1 个答案:

答案 0 :(得分:0)

在一些像Teradata这样的智能优化器中,两个查询中的任何一个都将以相同的方式重写:

 select a.columns,b.Col2,c.Col3  
 from TableA a

join TableB b
join TableC c 
on b.Col1=c.Col1
on a.Col3=bc.Col3 and bc.Col2 in (1,2,3,4)

请参阅说明,了解您的DBMS正在做什么。