반응형

안녕하세요


오늘은 서브쿼리 튜닝으로 돌아왔습니다.



서브쿼리 튜닝의 종류는 정말 다양합니다.



하지만!


이번 포스팅에서는


가장 중요한 두 가지!


merging과 unnesting에 대해 다뤄보도록 하겠습니다.






NO_MERGE     vs     NO_UNNEST



 NO_MERGE: 뷰나 인라인 뷰에 사용


(인라인 뷰 = FROM절의 서브쿼리)



NO_UNNEST: 인라인 뷰 외의 WHERE절 등의 서브쿼리에 사용




 NO_MERGE와 NO_UNNEST의 공통점은


서브쿼리 또는 뷰나 인라인 뷰 )

를 해체하지 말아라. 


라는 의미를 갖고 있습니다.



그럼 그 반대도 있겠죠?




 MERGE: 뷰나 인라인 뷰를 해체해라



UNNEST: 서브쿼리를 해체해라


(해쉬 테이블로 올릴 테이블을 직접 정하고자 할 때 사용)





먼저 서브쿼리 UNNESTING 문부터 알아보죠!



[짝꿍처럼 써줘야하는 힌트]



 NO_UNNEST: 서브쿼리를 해체하지 마라


1. PUSH_SUBQ: 서브쿼리부터 수행해라

2. NO_PUSH_SUBQ: 메인쿼리부터 수행해라


UNNEST: 서브쿼리를 해체해라


1. SWAP_JOIN_INPUT: 해쉬테이블로 올릴 테이블 지정

2.NO_SWAP_JOIN_INPUT: 해쉬테이블로 올리지 않을 테이블 지정




예제를 위한 테이블


[ emp ] : 사원테이블


사원명

나이

직업

연봉 

주소

 A

 35

 NULL

 NULL

 파주

 B

 34

 SALESMAN

 1600

 제주

 C

 38

 PRESIDENT

 5000

 서울

 D

 36

 SALESMAN

 1400

 파주

 E

 39

 ANALYST

 3000

 서울 

 F

 32

 SALESMAN

 1350

 서울

 G

 37

 MANAGER

 2850

 일산

 H

 35

 ANALYST

 3000

 파주

 I

 36

 SALESMAN

 1700

 서울



[ address ] : 주소테이블


주소 

 관할부서

 서울

 한국 A

 일산

 한국 B

 파주

 한국 C

 제주

 한국 D



예제1. 관할 부서가 한국A인 사원들의 이름, 직업, 연봉을 출력하세요.(서브쿼리로)




[결과]


사원명

직업

연봉 

주소

 C

 PRESIDENT

 5000

 서울

 E

 ANALYST

 3000

 서울 

 F

 SALESMAN

 1350

 서울

 I

 SALESMAN

 1700

 서울




다음으로 서브쿼리 MERGING 문을 알아보죠!




 MERGE: 뷰나 인라인 뷰를 해체해라


NO_MERGE: 뷰나 인라인 뷰를 해체하지 마라

 



예제2. 직업이 SALESMAN과 관련된 데이터만 들어있는 뷰를 생성하고 

그 뷰에서

관할부서가 한국A인 사원들의 이름, 직업, 연봉, 관할부서를 출력하세요.




사원 테이블이 1억건이고 그 중에 SALESMAN이 10건 있다고 가정하면


VIEW를 해체하지 않고 주소테이블과 조인하는 것이 더 효율적입니다.


[결과]


사원명

직업

연봉 

관할부서

 C

 PRESIDENT

 5000

 한국 A

 E

 ANALYST

 3000

 한국 A

 F

 SALESMAN

 1350

 한국 A

 I

 SALESMAN

 1700

 한국 A




오늘은 여기까지!


서브쿼리문을 실행할 때, 서브쿼리문으로 실행할 지,

아니면 조인의 형태로 변경해서 실행할지,


쿼리변환기를 제어하는 기술을 알아보았습니다!



다음엔 PLSQL을 약간 다뤄보겠습니다!

반응형

+ Recent posts