用于连接的SQL Server表或子查询?

时间:2018-04-15 16:11:54

标签: sql sql-server sql-server-2008

我现在使用的是在SQL Server 2012上运行的相当神秘的数据库(SAP),只有SELECT权限,因此有些事情很难调试/优化。

我有一个大表'table1',小表'table2','table3'。具有数百万行的大表将在“where”语句中最多过滤为100行

我必须从table1开始。你会建议:

select fields 
from table1
left join table2 
left join table3
where table1.field1 = 'x' 
  and table1.field2 = 'y'

或者

Select 
    fields 
from
    (select fields 
     from table1 
     where table1.field1 = 'x' and table1.field2 = 'y') as t1
left join
    table2
left join
    table3

为什么?我想更好地理解这一点。

谢谢!

1 个答案:

答案 0 :(得分:1)

理想情况

select fields 
from table1
left join table2
left join table3
where table1.field1 = 'x' and table1.field2 = 'y'

此代码将首先连接所有表,然后应用where条件中提到的过滤器。

Select fields 
from
     (select fields 
      from table1 
      where table1.field1 = 'x' and table1.field2 = 'y') as t1
left join table2
left join table3

此代码首先根据过滤条件过滤表,然后将其加载到临时位置,然后将过滤后的行连接到其他表。

如果table1有很多行,只有很少的行满足过滤条件(低基数),第二个代码运行得更快。

如果过滤器没有大量减少行数,那么瓶颈就是加载到代码2中的临时空间,因为代码1可能更好

注意::此答案将根据您的SQL引擎和查询优化器而更改。许多优化器足够聪明,可以检测到在代码1中只需要连接已过滤的行,因此在这种情况下code1会更好