繁体   English   中英

SQL Server表或子查询是否可以联接?

[英]SQL Server table or subquery for join?

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

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

我必须从表1开始。 您会建议:

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

而且,为什么呢? 我想更好地理解这一点。

谢谢!

理想的情况下

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中仅需要将过滤后的行进行连接,因此在这种情况下,代码1会更好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM