12

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

4

3 回答 3

11

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

于 2013-01-08T06:42:51.130 回答
2

阅读:在查询执行 WHERE CLAUSE 或 JOIN CLAUSE 中哪个先运行?

我正在回复 Pinal Dave 的帖子,我发现了这个,它可能会帮助你理解

SQL SERVER – 对 LEFT JOIN 中 ON 子句的有趣观察 – ON 子句如何影响 LEFT JOIN 中的结果集

在此处输入图像描述

在此处输入图像描述

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

于 2013-01-08T06:43:20.930 回答
2

复制自我之前的回答

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

WHERE 将在 JOIN 发生后过滤。

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

id          id
----------- -----------
2           2
于 2013-01-08T06:46:08.463 回答