어느 것이 더 낫습니까? 많은 조인 조건 또는 많은 조건이 있습니까?


13

두 가지 쿼리를 비교하려고합니다.

쿼리 1 :

SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a
WHERE tableA.b=tableB.b AND tableA.c=tableB.c  AND tableA.d=tableB.d  AND tableA.e=tableB.e 

쿼리 2 :

SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a AND tableA.b=tableB.b AND tableA.c=tableB.c  AND tableA.d=tableB.d  
WHERE tableA.e=tableB.e 

이 두 쿼리가 동일한 결과를 제공한다고 말할 수 있습니까?

또한 첫 번째 쿼리가 더 큰 WHERE조건 을 수행하기 위해 더 큰 테이블을 작성한다고 말하는 것이 맞습니다 . 두 번째 경우에는 간단한 테이블 WHERE이 적용 되는 더 작은 구성 테이블이 있습니다.

결과가 같다고 가정하면 어떤 쿼리를 선호해야합니까? 명백한 성능 문제가 있습니까?


3
아니, 당신은 옳은 말을하지 않습니다. 그것이 인 경우 INNER JOIN일 것이지만, LEFT JOIN이것으로 다른 결과를 반환합니다. 기본적으로 WHERE두 번째 검색어에 추가 한 조건은 다음에서 전환합니다 JOIN.INNER JOIN
Lamak

그래. 나는 당신이 말하는 것을 따릅니다. INNER JOIN성능에 대한 질문을 편집하도록 수정 해도 여전히 유효합니까?
Geoff

4
내부 가입의 경우 성능 차이가 없어야합니다. 즉, 가독성과 의도를 올바르게 표현하려면의 ON및 기준에서 조인 기준을 사용해야 합니다 WHERE.
Aaron Bertrand

@ ypercube 맞아, 나는 그 상태를 놓쳤다.
Lamak

답변:


10

(의도적 인 것처럼 보이는) INNER JOIN대신에 사용한다고 생각하면 LEFT JOIN이 두 쿼리는 기능적으로 동일합니다. 쿼리 최적화 프로그램은 가장 효율적인 실행 계획에 도달하기 위해 쿼리 계획을 작성할 때 절과 WHERE절의 기준을 검토하고 평가 FROM하며 이러한 모든 요소를 ​​고려합니다. 우리가 EXPLAIN두 진술을 모두 수행 하면 동일한 결과를 얻습니다.

쿼리 1 :

EXPLAIN
SELECT 
  tableA.ColA
  ,tableA.ColB
  ,tableA.ColC
  ,tableA.ColD
  ,tableA.ColE
FROM tableA
  JOIN tableB ON tableA.ColA=tableB.ColA
WHERE 
  tableA.ColB=tableB.ColB 
  AND tableA.ColC=tableB.ColC 
  AND tableA.ColD=tableB.ColD  
  AND tableA.ColE=tableB.ColE

[결과] :

| ID | SELECT_TYPE |  TABLE | TYPE | POSSIBLE_KEYS |    KEY | KEY_LEN |    REF | ROWS |                          EXTRA |
------------------------------------------------------------------------------------------------------------------------
|  1 |      SIMPLE | tableA |  ALL |        (null) | (null) |  (null) | (null) |    1 |                                |
|  1 |      SIMPLE | tableB |  ALL |        (null) | (null) |  (null) | (null) |    1 | Using where; Using join buffer |

쿼리 2 :

EXPLAIN
SELECT 
  tableA.ColA
  ,tableA.ColB
  ,tableA.ColC
  ,tableA.ColD
  ,tableA.ColE
FROM tableA
  JOIN tableB ON tableA.ColA=tableB.ColA
  AND tableA.ColB=tableB.ColB 
  AND tableA.ColC=tableB.ColC 
  AND tableA.ColD=tableB.ColD  
WHERE
  tableA.ColE=tableB.ColE

[결과] :

| ID | SELECT_TYPE |  TABLE | TYPE | POSSIBLE_KEYS |    KEY | KEY_LEN |    REF | ROWS |                          EXTRA |
------------------------------------------------------------------------------------------------------------------------
|  1 |      SIMPLE | tableA |  ALL |        (null) | (null) |  (null) | (null) |    1 |                                |
|  1 |      SIMPLE | tableB |  ALL |        (null) | (null) |  (null) | (null) |    1 | Using where; Using join buffer |

다음 링크를 통해 전체 세부 사항을 검토 할 수 있습니다. 또한 두 엔진의 작동 방식을 동일하게 비교할 수 있도록 SQL 2008 예제를 만들었습니다.

MySQL 쿼리 예

SQL 2008 쿼리 예 (두 결과 모두에 대해 '실행 계획보기'를 확인하십시오)


자세한 솔루션에 감사드립니다. INNER JOIN대신에 시도 LEFT JOIN하고 10 분의 1에 동일한 출력을 얻습니다. 나는 왜 같은 결과를 얻는 지 알고 있지만 왜 INNER JOIN더 나은 성능을 얻 습니까?
Geoff

4
LEFT JOIN외부 조인과 마찬가지로 세트의 전체 리턴 측에서 데이터 세트를 제한 할 수 없으며 해당 테이블 (이 경우 TableA)에서 모든 행을 검색하려고합니다. 을 사용하면 INNER JOIN두 테이블 모두에서 해당 기준을 활용하고 데이터 세트를 제한하여 더 빠른 리턴을 제공 할 수 있습니다.
Mike Fal 2013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.