[sql] SQL에서 조인 순서가 중요합니까?

성능을 무시하면 아래 쿼리 A와 B에서 동일한 결과를 얻을 수 있습니까? C와 D는 어떻습니까?

-- A
select *
from   a left join b
           on <blahblah>
       left join c
           on <blahblan>


-- B
select *
from   a left join c
           on <blahblah>
       left join b
           on <blahblan>

-- C
select *
from   a join b
           on <blahblah>
       join c
           on <blahblan>


-- D
select *
from   a join c
           on <blahblah>
       join b
           on <blahblan>  



답변

들어 INNER조인, 더, 순서는 중요하지 않습니다 않습니다. 선택 항목을에서 (으) SELECT *로 변경하는 한 쿼리는 동일한 결과를 반환 합니다 SELECT a.*, b.*, c.*.


( LEFT, RIGHT또는 FULL) OUTER조인의 경우 순서가 중요하며 업데이트 된 사항은 훨씬 복잡합니다.

첫째, 외부 조인은 교환 적이 지 a LEFT JOIN b않으므로 다음과 같습니다.b LEFT JOIN a

외부 조인도 연관성이 없으므로 예제에서 (정류 성과 연관성) 속성을 모두 포함합니다.

a LEFT JOIN b
    ON b.ab_id = a.ab_id
  LEFT JOIN c
    ON c.ac_id = a.ac_id

다음과 같습니다 .

a LEFT JOIN c
    ON c.ac_id = a.ac_id
  LEFT JOIN b
    ON b.ab_id = a.ab_id

그러나:

a LEFT JOIN b
    ON  b.ab_id = a.ab_id
  LEFT JOIN c
    ON  c.ac_id = a.ac_id
    AND c.bc_id = b.bc_id

다음과 동일하지 않습니다 .

a LEFT JOIN c
    ON  c.ac_id = a.ac_id
  LEFT JOIN b
    ON  b.ab_id = a.ab_id
    AND b.bc_id = c.bc_id

또 다른 (희망적으로 더 간단한) 연관성 예제입니다. 이것을 다음과 같이 생각하십시오 (a LEFT JOIN b) LEFT JOIN c:

a LEFT JOIN b
    ON b.ab_id = a.ab_id          -- AB condition
 LEFT JOIN c
    ON c.bc_id = b.bc_id          -- BC condition

동등a LEFT JOIN (b LEFT JOIN c):

a LEFT JOIN
    b LEFT JOIN c
        ON c.bc_id = b.bc_id          -- BC condition
    ON b.ab_id = a.ab_id          -- AB condition

“좋은” ON조건 이 있기 때문 입니다. 모두 ON b.ab_id = a.ab_id와 것은 c.bc_id = b.bc_id평등을 확인하고 포함하지 않는 NULL비교를.

당신은 같은 다른 사업자와 조건이나 더 복잡한 것들을 할 수 있습니다 : ON a.x <= b.x또는 ON a.x = 7또는 ON a.x LIKE b.x또는 ON (a.x, a.y) = (b.x, b.y)두 쿼리는 여전히 상당 할 것이다.

그러나 이러한 조건 중 하나 IS NULL또는 COALESCE()예를 들어 조건이 b.ab_id IS NULL인 경우 와 같이 null과 관련된 함수 인 경우 두 쿼리는 동일하지 않습니다.


답변

일반 조인의 경우 그렇지 않습니다. TableA join TableB동일한 실행 계획을 생성 TableB join TableA하므로 (C 및 D 예제는 동일)

왼쪽 및 오른쪽 조인이 수행합니다. TableA left Join TableB과 다른 TableB left Join TableA,하지만 이외의 동일TableB right Join TableA


답변

B에 가입하기 전에 B의 필드에서 C에 가입하려고 시도하는 경우 :

SELECT A.x, A.y, A.z FROM A
   INNER JOIN C
       on B.x = C.x
   INNER JOIN b
       on A.x = B.x

쿼리가 실패하므로이 경우 순서가 중요합니다.


답변

Oracle Optimizer 는 내부 조인을 위해 테이블의 조인 순서를 선택합니다. 옵티마이 저는 간단한 FROM 절에서만 테이블의 조인 순서를 선택합니다. U는 그들의 웹 사이트에서 오라클 문서를 확인할 수 있습니다. 그리고 왼쪽, 오른쪽 외부 조인에서 가장 투표 된 답변이 맞습니다. 옵티마이 저는 최적의 조인 순서와 각 테이블에 대한 최적의 인덱스를 선택합니다. 조인 순서는 어떤 인덱스가 최선의 선택인지에 영향을 줄 수 있습니다. 옵티마이 저는 테이블이 내부 테이블 인 경우 테이블에 대한 액세스 경로로 인덱스를 선택할 수 있지만 외부 테이블 인 경우에는 더 이상 자격 조건이없는 경우 인덱스를 선택할 수 없습니다.

옵티마이 저는 간단한 FROM 절에서만 테이블의 조인 순서를 선택합니다. JOIN 키워드를 사용하는 대부분의 조인은 단순 조인으로 병합되므로 옵티마이 저가 조인 순서를 선택합니다.

옵티마이 저는 외부 조인에 대한 조인 순서를 선택하지 않습니다. 명령문에 지정된 순서를 사용합니다.

조인 순서를 선택할 때 옵티마이 저는 다음을 고려합니다. 각 테이블의 크기 각 테이블에서 사용 가능한 인덱스 특정 조인 순서에서 테이블의 인덱스가 유용한 지 여부 각 테이블에서 스캔 할 행 및 페이지 수 주문에 가입


답변