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