반응형

안녕하세요


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



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



하지만!


이번 포스팅에서는


가장 중요한 두 가지!


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을 약간 다뤄보겠습니다!

반응형
반응형



인덱스 튜닝보다 더 중요한 조인 튜닝! 


조인은 두개 이상의 이상의 테이블을 스캔하기때문에

더 많은 시간이 걸립니다.


오라클 조인을 모른다면 여기부터!



오늘은


2번에 걸쳐 조인튜닝에 대해 다뤄보도록 하겠습니다.


조인 튜닝시에 가장 중요한 2가지


1. 조인 순서


 

(1) ordered: FROM 절에서 기술한 테이블 순서대로 조인


(2) leading: leading힌트 안에 테이블 순서대로 조인



2. 조인 방법



(1) use_nl: nested loop 조인


(2) use_hash: hashe loop 조인


(3) use_merge: sort merge loop 조인





오늘은 1. 조인 순 2가지 방법에 대해 알아봅시다!



오늘도 역시 예제를 위한 테이블 먼저 보고 갑시다!


[ 고객 테이블 ]


고객이름

 나이

  주소 

 총구매액

 추천인

 A

 24

 서울

 30000

 null

 B

 29

 서울

 10000

 A

 C

 26

 파주

 25000

 A

 D

 27

 제주

 1000

 B

 E

 25

 서울

 20000 C
 F 30 일산

 25000

 B
 G 32 파주 10000

 F

 H 23 일산 32000 A



[ 주소 테이블 ]


주소 

 관할부서

 서울

 한국 A

 일산

 한국 B

 파주

 한국 C

 제주

 한국 D




문제1. 관할부서가 한국 A인 고객들의

고객이름, 나이, 주소, 관할부서를

아래의 조건을 만족시켜서 출력하세요


(조인 순서: '주소테이블 --> 고객테이블' 순, ordered hint 사용하기)



조인 순서를 지정하는 방법 중

ordered 방법은 FROM절의 순서에 맞게

조인 순서를 지정할 수 있습니다.



문제에서 조인순서로

주소테이블을 먼저 scan하도록 지정한 이유가 무엇일까요?


row의 갯수가 적은 것을 먼저 스캔하는 것이 더 빠르기때문입니다.


 

SQL1> SELECT COUNT(*) FROM 주소 WHERE 주소 = '서울' ;


결과: 1


SQL2> SELECT COUNT(*) FROM 고객 WHERE 주소 = '서울' ;


결과: 3





문제2. 관할부서가 한국 A인 고객들의

고객이름, 나이, 주소, 관할부서를

아래의 조건을 만족시켜서 출력하세요


(조인 순서: '주소테이블 --> 고객테이블' 순, leading hint 사용하기)



문제는 같고 조인순서관련 조건만 다릅니다.



문제1과 문제2의 다른 점을 발견하셨나요?


ordered 와 leading의 가장 다른 부분은

FROM절에서 조인하는 순서에 맞추지 않아도 된다는 점입니다.


만약 조인하고자 하는 테이블이 여러개일 경우

FROM절에서 그 순서를 맞추기는 대략난감..;;


만약 데이터가 바뀌어서 COUNT를 다시 했는데 순서를 바꿔야한다?

쩝...


이때 ordered대신 leading hint를 사용하면

FROM절의 테이블 순서와 상관없이

직접 그 순서를 손쉽게 바꿀 수 있습니다. 



조인절이 궁금하다면 여기로!




오늘은 여기까지 간단하게 조인튜닝1_조인순서에 대해 알아보았습니다.


다음은 조인튜닝2_조인 방법으로 돌아오겠습니다~


Have a nice weekend



이 글이 도움되셨다면 아래 공감 꾹~ 



반응형

+ Recent posts