2013-01-08 3 views
10

13 개의 LEFT OUTER JOINS를 사용하는 쿼리가 있습니다. 왼쪽 테이블에는 큰 데이터가 있으므로 쿼리를 실행하고 결과를 반환하는 데 많은 시간이 걸립니다. 그러나 where 절을 사용하여 결과를 필터링 할 때 시간이 매우 짧습니다. 이제 나는 어느 것이 먼저 실행되는지 혼란 스럽습니다 : 결과를 생성하는 조인과 그로부터 where 절 필터 또는 먼저 결과의 조인을 취하는 결과를 필터링합니다.이 먼저 실행됩니다. 조인 또는 where 절

+3

서버가 작업을보다 쉽게 ​​수행 할 수 있도록 관계없이 SQL 서버의 쿼리 최적화 프로그램이 주위에 당신의 단계를 임의 재생으로 선택하는 방법, 당신이 할 수있는 최선의 일은 당신의 자료를 제대로 유지하고 색인을 유의하십시오. –

+1

잘 유지'통계 '도 도움이됩니다. – MarkD

+0

당신이 정보를 가지고 있다면 받아들이는 것을 잊지 말고 upvote하는 것을 잊어 버려라. –

답변

10

일반적으로 모든 DBMS (예 : SQL)는 가장 빠른 것으로 생각되는 알고리즘을 사용하는 자체 쿼리 최적화를 수행합니다. 그래서 필터링 중이고 가입합니다.

2

읽기 : which one runs first in query execution WHERE CLAUSE orJOIN CLAUSE ?

내가 PINAL 데이브의 게시물을 레딩, 그리고 난이 발견, 당신이 이해하는 데 도움을 talso migh

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

ON 절을 이해하는 것은 JOIN 전에 적용됩니다. 이는 Flag = 1 인 Table2의 모든 결과를 검색하지만 Table1에 영향을 미치지 않으므로 table1의 모든 행을 검색합니다. WHERE 절이 적용되면 완전한 결과에 적용될 때 Table1과 Table2에서 Flag1이 같지 않은 모든 행이 제거되므로 기본적으로 Table1과 Table2에서 flag = 1 행이 유지됩니다.

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 

필터의 상기 가입 과정에서 첨가되는 행을 방지하기 위해 가입.

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