我现在使用的是在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
为什么?我想更好地理解这一点。
谢谢!
答案 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会更好