본문 바로가기

공부/SQL

[liveSQL] 조인 - Hash Semi 조인, 조건문에 따른 실행계획 차이

 

1. Hash Semi Join과 Filter Semi Join

  1. < 해시 세미 조인은 '='로 연결된다. >  '=' 이외에 연산이 추가되면 어떻게 동작을 하나.
  2. 아울러서 'Filter' 형 Semi Join과 헷갈리는 부분(둘다 In, Exists 사용하므로) 해소.

 

2. 실행 결과

//Hash SJ 대표적인 형태

SELECT -
FROM A a
WHERE EXISTS (SELECT 'x' FROM B b
              WHERE a.id = b.id AND other condition)
              
//저기서 
//"other condition" 부분을 추가하는 것으로, 
//차이를 알아보고자 함.

 

(1) '='만 사용

 

(2.1) '(1)' + 서브 쿼리 문내 조건절 추가(uncorrated, corrated)

corralted와 uncorralated 결과 같음.

- corralted : 메인 쿼리 내의 컬럼을 서브쿼리에서 사용하는 경우

- uncorralted : 메이 쿼리 내의 컬럼을 서브쿼리에서 사용하지 않는 경우, 서브 쿼리는 *제공자로서 역할을 한다.

* 제공자 : 서브 쿼리가 먼저 실행되면서 메인 쿼리로 '실행된 값'을 전달하는 형태

 

(2.2) '(1)' + 메인 쿼리 문내 조건절 추가

 

(3) In 절 표현

//Hash SJ - In 절로 표현
//대표적인 형태

SELECT -
FROM A
WHERE (A.COL1,...) IN (SELET B.COL1,.... FROM B
					   WHERE other condition);

Exists -> In 으로 표현한 결과

 

3. 중간 결과

  • 일단 '=' 연산자로 묶이면 기본적으로 Hash 조인 형태로 동작하였음.  
  • In 절은 Selet-list 컬럼을 하나의 연결고리로, '='과 동급의 표현.
    • 따라서 Hash 조인 형태로 수행

 

4. 필터형 SJ ('=' 연산자 없는 경우 or 연결고리가가 없는 경우)

 

// Filterd Semi SJ 
// 대표적인 형태

SELECT -
FROM A
WHERE EXISTS (SELECT 1 FROM B
			  WHERE other condition);

//other condition을 변형하되
//(A.id = B.id)인 경우는 제외.

(1) corralted 한 경우 (서브 쿼리 내부에 테이블 A의 컬럼이 사용된 경우)

 

 

(2) uncorralated 한 경우

 

5. 참고

(1) 코드 참고

https://github.com/snrndi121/SQL_CODE_STUDY/blob/master/join/hash.md#11--%EC%97%B0%EC%82%B0%EC%9E%90-%EC%A1%B4%EC%9E%AC

 

snrndi121/SQL_CODE_STUDY

based Oracle. Contribute to snrndi121/SQL_CODE_STUDY development by creating an account on GitHub.

github.com

 

(2) 해시 조인