반응형

오랜만에 돌아왔네요!





이전 포스팅과 이어지는


조인튜닝 2번째탄을 갖고왔습니다!


오늘은 알아두면 좋은 조인 튜닝 방법에 대해 알아보죠!



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


1. 조인 순서


 

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


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



2. 조인 방법



(1) use_nl: nested loop 조인


(2) use_hash: hash loop 조인


(3) use_merge: sort merge loop 조인


(4) outer join







nested loop 조인 vs hash loop 조인


nested loop join이란 중첩된 조인 방법으로

두개의 테이블을 조인할 때 한 건, 한 건씩 순차적으로 반복해서 조인하는 방법입니다.


단, 조인되는 건수가 작을 때 유리한 조인 방법입니다!



hash 조인이란 데이터가 적은 테이블을 메모리에 올려두고

해쉬함수를 이용해 두번째 테이블과의 조인을 시도하는 방법입니다.


메모리가 속도가 훨씬 빠르기때문에 대용량 데이터의 경우,

해쉬조인을 하면 속도가 굉장히 빨라집니다.


단, 메모리를 많이 이용하는 방법은 협업시

다른 사람의 쿼리 속도를 늦출 수 있습니다.




먼저 해쉬조인의 원리부터 파악해봅시다!



해쉬조인을 할 때 두개의 테이블은

해쉬테이블prob(탐색) 테이블로 나뉩니다.



 

          (1) 해쉬테이블이란?


메모리로 올라가는 테이블


          (2) 탐색테이블이란? 


                  디스크에서 메모리에 있는 해쉬테이블과 조인하는 테이블





예제를 위해 사용할 테이블


[ 고객 테이블 ]


고객이름

 나이

  주소 

 총구매액

 추천인

 A

 24

 서울

 30000

 null

 B

 29

 서울

 10000

 A

 C

 26

 파주

 25000

 A

 D

 27

 null

 1000

 B

 E

 25

 서울

 20000 C
 F 30 일산

 25000

 B



[ 주소 테이블 ]


주소 

 관할부서

 서울

 한국 A

 일산

 한국 B

 파주

 한국 C

 제주

 한국 D




예제1. 고객이름, 주소, 관할부서, 총구매액을 알고 싶습니다.

해쉬조인을 사용하여 두개의 테이블을 조인하세요.





[결과]


 고객이름

 주소

 관한부서

 총구매액

 A

 서울

 한국A

 30000

 B

 서울

 한국A

 10000

 C

 파주

 한국C

 25000

 F

 일산

 한국B

 25000

 E

 서울

 한국A

 20000



/*+ leading(a c) use_hash(c) */와 같이 힌트를 사용하면 됩니다.


아마 힌트를 주지 않아도 옵티마이저가 알아서 hash조인을 하는 경우도 있지만


이러한 힌트를 명시해주는 것이 바람직합니다.


여기서 잠깐!

힌트 사용시 별칭을 이용해야합니다!


예를 들어 아래와 같이 해쉬조인 사용시 힌트를 이용할 수 있습니다.



hash join 사용 힌트



(1) Use_hash(테블명)해쉬조인하라는 힌트


(2) Swap_join_inputs: 해쉬테이블을 선정할때 사용하는 힌트


(3)No_swap_join: prob테이블을 선정할 때 사용하는 힌트


(4) parallel(a, b) : 해쉬조인시 병렬작업하는 힌트





예제2. 이름, 관할부서를 출력하는 OUTER 문장을 작성하는데

주소가 null인 고객D가 출력되게 해쉬조인하세요

(단, 주소 테이블에서 고객테이블 순으로)




혹시 leading을 쓰셨나요?


조인할 때 outer join 사인을 사용하면 join 순서는 무조건 outer join 사인이 없는 쪽에서 먼저 조인이 됩니다. 



따라서


/*+ swap_join_inputs(a) use_hash(c) */ 를 사용해야

아래와 같은 실행계획을 얻을 수 있습니다.



[결과]


 고객이름

 관한부서

 A

 한국A

 B

 한국A

 C

 한국C

 D null

 F

 한국B

 E

 한국A




예제3. 고객이름, 주소, 관할부서를 출력하는데

해쉬조인 문장으로 병렬처리해서 출력하세요.



/*+ leading(a c) use_hash(c) full(a) full(c) 

parallel(a, 4) parallel(c, 4) */ 

과 같이 병렬처리를 하는 이유는 보다 빠른 쿼리 속도를 위해서 입니다.


hash join시 무조건 table access full을 해야합니다.




참고) non-equi-join의 경우 해쉬조인을 쓸수 없습니다.


하지만 대용량 테이블이어서 hash조인을 사용할 수 밖에 없을 때
sort merge 조인 이용할 수 있습니다.
(물론 병렬처리도 가능하겠죠?)


방법은 예제 1번에서 use_hash대신에 use_merge를 넣는 것입니다!

쉽죠?



지금까지 간단한 방법으로

조인의 쿼리속도를 빠르게하는 방법을 알아보았습니다.


다음 포스팅은 서브쿼리 튜닝입니다!!

반응형
반응형



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


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

더 많은 시간이 걸립니다.


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



오늘은


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



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



반응형
반응형



안녕하세요!


오늘부터 쿼리의 검색 속도를 높일 수 있는 SQL 튜닝을 포스팅하겠습니다.


대용량 데이터 환경(빅데이터)에서 필수가 되어가고 있습니다.


이제 인덱스 튜닝에 대해 알아보도록 하겠습니다.



[인덱스 튜닝의 종류]



1. index range scan

2. index unique scan

3. index skip scan

4. index full scan

5. index fast full scan

6. index merge scan

7. index bitmap merge scan

8. index join

 


index range scan과 index unique scan은

이전에 index 포스팅 에서 다뤘습니다!



"예제를 위한 테이블 소개"


[사원] 테이블


EMPNO

ENAME

JOB

SAL

DEPT

 ALLEN

 SALESMAN

 1250

 서울시

 2 

 BAKE

 SALESMAN

 1600

 서울시

 3 

 CLARK

 MANAGER

 3000

 세종시

 4 

 WARD

 CLERK

 1100

 인천광역시

 5 

 JAMES

 ANALYST

 3000

 부산광역시

 6 

 FORD

 ANALYST

 3000

 세종시

 7 

 SMITH

 CLERK

 1300

 세종시

 8 

 MILLER

 MANAGER

 2450

 서울시



index skip scan

인덱스 전부 스캔하지 않고 SKIP해서 스캔하는 엑세스 방법


예제1. 직업과 월급으로 결합컬럼 인덱스를 생성하고

아래의 SQL이 index scan할 수 있도록 힌트를 주세요



      SQL1> SELECT ename, job, sal

                         FROM 사원

                         WHERE sal = 3000;

 




결합 컬럼 인덱스의 첫번째 컬럼이 where 절에서 검색조건으로 존재해야

그 인덱스를 엑세스할 수 있습니다.


하지만 위와 같은 상황일 때,

emp_job_sal 인덱스를 엑세스하게 하려면 인덱스 스킵 조건을 쓸 수 있습니다.



단, 인덱스 스킵 스캔의 효과를 보기위한 조건이 있습니다.

결합컬럼 인덱스의 첫번째 컬럼의 종류가 많으면 그 효과를 볼 수 없습니다.



index full scan


인덱스 전체를 처음부터 끝까지 스캔하는 방법


예제2. 사원 테이블의 사원번호에 primary key를 생성하고

사원의 인원수가 몇 명인지 카운트 하세요




위의 SQL을 실행하면 INDEX FULL SCAN을 하게 됩니다.

TABLE FULL SCAN보다 훨씬 더 성능이 좋습니다.



만약 위의 결과에서 index full scan이 되지 않는다면 어떻게 해야할까요?



쿼리에 index full scan hint를 추가하면 됩니다.


index full scan의 힌트는

 /*+ index_fs(사원 emp_empno_pk) */ 

입니다.


(잘 모르겠다면 예제1번의 정답을 다시 확인하고 오세요!)

 



index fast full scan


index full scan보다 더 성능이 좋은 스캔 방법


병렬처리가 가능합니다.


예제3. 부서와 부서별 인원수를 출력하는데

빠르게 출력될 수 있도록 적절한 인덱스를 생성하고 힌트를 주고

병렬처리하여 실행하세요.




<SQL3_2의 힌트 설명>


병렬_인덱스(테이블, 인덱스이름, 사용할 CPU개수)



인덱스가 무엇인지 궁금하다면 여기로!




오늘은 여기까지!


중요한 인덱스 튜닝은 index range scanindex skip scan이랍니다~

알아두고 넘어갑시다!



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



반응형

+ Recent posts