首先运行:join或where子句

时间:2013-01-08 06:36:37

标签: sql sql-server-2008

我有一个查询,其中我使用13 LEFT OUTER JOINS。左边的表有一个大数据,因此执行查询并返回结果需要很长时间。 但是当我使用where子句来过滤结果时,它只需要很少的时间。 现在我很困惑哪个首先执行:产生结果的连接然后where子句从中过滤或者首先过滤结果,得到结果的连接。

3 个答案:

答案 0 :(得分:10)

通常,任何DBMS(例如SQL)都会执行自己的查询优化,它使用它认为最快的算法。所以它是过滤,然后加入。

答案 1 :(得分:2)

阅读:which one runs first in query execution WHERE CLAUSE orJOIN CLAUSE ?

我正在改变Pinal Dave的帖子,我发现了这个,它还能帮助你理解

SQL SERVER – Interesting Observation of ON Clause on LEFT JOIN – How ON Clause affects Resultset in LEFT JOIN

enter image description here

enter image description here

理解它在JOIN之前应用的ON子句,这就是为什么它检索Table2的所有结果,其中有Flag = 1但它不影响Table1,因此它检索table1的所有行。当应用WHERE子句时,它将应用于完整结果,因此它将删除Table1和Table2中Flag不等于1的所有行,从而基本上保持Table1和Table2中的flag = 1行。

答案 2 :(得分:2)

Copied from my previous answer

create table A(id int);
create table B(id int);

INSERT INTO A VALUES(1);
INSERT INTO A VALUES(2);
INSERT INTO A VALUES(3);

INSERT INTO B VALUES(1);
INSERT INTO B VALUES(2);
INSERT INTO B VALUES(3);

SELECT * FROM A;
SELECT * FROM B;

id
-----------
1
2
3

id
-----------
1
2
3

过滤JOIN以防止在JOIN过程中添加行。

select a.*,b.*
from   A a left join B b 
on     a.id =b.id and a.id=2;

id          id
----------- -----------
1           NULL
2           2
3           NULL

JOIN发生后将在哪里过滤。

select a.*,b.* 
from   A a left join B b 
on     a.id =b.id 
where  a.id=2;

id          id
----------- -----------
2           2