반응형

오랜만에 돌아왔네요!





이전 포스팅과 이어지는


조인튜닝 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를 넣는 것입니다!

쉽죠?



지금까지 간단한 방법으로

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


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

반응형
반응형


오늘은~ JOIN절 2탄!


1탄은 ORACLE | JOIN을 사용하는 오라클만의 방법! 에 있습니다~



JOIN은 기본적으로 위의 퍼즐같이 두개 이상의 테이블의 컬럼을 합쳐서

하나의 테이블처럼 사용하는 방법입니다.


그럼~ 차근차근 따라가 볼까요?



오라클 조인 문법과 1999 ANSI 조인 문법을 모두 이용하여 문제를 풀어보겠습니다.



[ 고객 테이블 ]


고객이름

 나이

  주소 

 총구매액

 추천인

 A

 24

 서울

 30000

 null

 B

 29

 서울

 10000

 A

 C

 26

 파주

 25000

 A

 D

 27

 제주

 1000

 B



[ 주소 테이블 ]


주소 

 관할부서

 서울

 한국 A

 일산

 한국 B

 파주

 한국 C

 제주

 한국 D



[ 등급 테이블 ]


고객등급 

 최소구매액

 최대구매액

 1

 0

 9999

 2

 10000

 19999

 3

 20000

 30000




문제1. 고객 이름, 관할부서, 고객등급을 출력하시오





결과


 고객이름

 관할부서

 고객등급

 A

 한국 A

 3

 B

 한국 A

 2

 C

 한국 C

 3

 D

 한국 D

 1




중요!


TABLE이 3개일 경우 연결고리는 2 ( = 3 - 1) 개 입니다.



오라클 조인 문법에서 JOIN절의 WHERE절은 '조인 조건'으로 사용됩니다.



여기서 주의해야할 점은 1999 ANSI문법의 경우 양쪽에 연결고리가 있는 테이블명을 먼저 작성해야합니다.


또한, 1999 ANSI문법의 경우 오라클 문법과 달리 WHERE절은 그저 '검색 조건' 입니다.


따라서 JOIN절에서 조인 조건을 주기 위해서는 ON절을 사용하여 '조인 조건'을 줄 수 있습니다.




오라클 Database에서는 어떠한 문법을 사용하여도 문제가 없습니다.


하지만,


1999 ANSI 문법의 경우 '조인 조건' ON과 '검색 조건' WHERE이 별개로 구분되어 있기 때문에

보다 가독성이 좋다고 하네요~




추가) using절을 사용한 조인과 natural join



위의 정답 문법을 각각 using 절과 natural join으로 바꾼 SQL문을 먼저 확인하시죠.



 

       SQL> SELECT c.고객이름, a.관할부서, g.고객등급

FROM 고객 c JOIN 주소 a

USING ( 주소 )  

JOIN 등급 g

ON ( c.총구매액 BETWEEN 최소구매액 AND 최대구매액 );





 

       SQL> SELECT c.고객이름, a.관할부서, g.고객등급

FROM 고객 c NATURAL JOIN 주소 a

 JOIN 등급 g

ON ( c.총구매액 BETWEEN 최소구매액 AND 최대구매액 );





먼저 using절에서 주의사항이 있습니다.


 using절에서는 테이블 별칭 즉, c.주소 or a.주소를 사용하지 않습니다.



natural join의 경우 오라클이 알아서 고객 table과 주소 table의 공통의 컬럼(column)을 찾아서 조인을 합니다!


natural join에서 주의할 점은

공통 컬럼이 없는 경우 or data type이 다른 경우 오류가 발생한다는 것입니다.


(참고: data type을 모른다면 여기!)




오늘은 여기까지


내일은 집합 연산자 union으로 돌아올겠습니다!



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



반응형
반응형


안녕하세요!


오늘은 오라클에서 테이블을 JOIN하는 방법에 대해 알아보겠습니다.




JOIN이란?


여러 개의 테이블의 데이터를 하나의 결과(테이블)로 모아서 출력하는 SQL문법입니다.



조인의 종류는 크게 오라클 조인 문법과 1999 ANSI 조인 문법으로 나눌 수 있습니다.


1999 ANSI 조인은 많은 관계형 데이터베이스에서 공통적으로 사용하는 SQL문입니다. 프로그래머를 꿈꾸는 많은 분들이 사용하는 MySQL에서는 이 방법을 사용하고 있습니다.


반면에 오라클 조인문법은 오라클에서 독자적으로 만들어 JOIN SQL문법을 사용하였습니다.


하지만 현재, 오라클에서는 독자적인 오라클 조인문법과 1999 ANSI 조인문법을 모두 이용하여 테이블 JOIN을 할 수 있답니다.



1. 오라클 조인 문법


  

  (1) EQUI JOIN


  (2) NON EQUI JOIN


  (3) OUTER JOIN


  (4) SELF JOIN




2. 1999 ANSI 조인 문법



  (1) FULL OUTER JOIN


  (2) RIGHT/LEFT OUTER JOIN


  (3) ON절을 사용한 JOIN


  (4) USING절을 사용한 JOIN


  (5) NATURAL JOIN


  (6) CROSS JOIN





앞으로 아래의 테이블을 활용하겠습니다.

우선 테이블의 관계를 살짝 확인하고 따라 오세요!



[ 고객 테이블 ]


고객이름

 나이

  주소 

 총구매액

 추천인

 A

 24

 서울

 30000

 null

 B

 29

 일산

 10000

 A

 C

 26

 파주

 25000

 A

 D

 27

 

 0

 B



[ 주소 테이블 ]


주소 

 관할부서

 서울

 한국 A

 일산

 한국 B

 파주

 한국 C

 제주

 한국 D



[ 등급 테이블 ]


고객등급 

 최소구매액

 최대구매액

 1

 0

 9999

 2

 10000

 19999

 3

 20000

 30000





  EQUI JOINNON EQUI JOIN



EQUI JOIN 예시


고객이름, 나이, 주소, 관할부서를 알고 싶어요!


 

 SQL> SELECT c.고객이름, c.나이, c.주소, a.관할부서

                  FROM 고객 c, 주소 a

                  WHERE c.주소 = a.주소 ;




결과:


고객이름 

 나이

 주소

 관할부서

 A

 24

 서울

 한국 A

 B

 29

 일산

 한국 B

 C

 26

 파주

 한국 C




NON EQUI JOIN 예시


고객이름, 나이, 고객등급을 알고 싶어요!



 

 SQL> SELECT c.고객이름, c.나이, g.고객등급

             FROM 고객 c, 등급 g

             WHERE c.총구매액 

                       BETWEEN g.최소구매액 AND g.최대구매액 ;




결과:


고객이름 

 나이

 고객등급

 A

 24

 3

 B

 29

 2

 C

 26

 3

 D

 27

 1



위의 SQL문의 차이를 발견하셨나요?


문제1. EQUL JOIN과 NON EQUI JOIN의 차이는 무엇일까요?




또한,


각각의 예시에서 알 수 있듯이 JOIN을 하기위해서는 WHERE절을 통해 연관 데이터로 조인 조건을 줍니다.


이때 WHERE절은 검색조건이 아닌 '조인 조건'입니다.



추가 문제: 만약, 조인 조건이 없을 경우에는 어떻게 될까요?






  OUTER JOIN


OUTER JOIN은 


EQUI JOIN으로는 볼 수 없는 결과를 볼 때 사용하는 조인입니다.

(EQUI JOIN으로 조인되지 않은 데이터를 볼 때 사용하는 방법입니다.)



문제2. 위의 EQUL JOIN 예시의 결과를 보면 주소가 없는 고객 D는 출력되지 않았습니다.

과연, JOIN시에 고객D를 출력하고 싶으면 어떻게 해야할까요?





이때 사용하는 것이 바로 OUTER JOIN SIGN입니다.


ORACLE에서는 ( + ) 를 이용하여 OUTER JOIN이 가능합니다.


결과:


고객이름 

 나이

 주소

  관할부서

 A

 24

 서울

 한국 A

 B

 29

 일산

 한국 B

 C

 26

 파주

 한국 C

 D

 27

 null

 null



* 참고: 1999 ANSI JOIN절에서는 LEFT / RIGHT OUTER JOIN절로 위와 같은 결과를 출력할 수 있습니다.




  SELF JOIN


문제3. 고객이름, 추천인 이름을 알고 싶습니다.





위의 문제의 경우 SELF JOIN을 이용하여 결과를 출력합니다.


SELF JOIN은 자기 자신의 테이블과 조인하는 문법으로


FROM문에서 테이블 별칭을 사용하여 마치 두개의 테이블이 존재하는 것처럼 JOIN문을 작성하면 됩니다.




여기까지!


어렵지만 중요한 JOIN문에 관한 문법을 알아봤습니다!


특히 MySQL을 사용하던 사람으로서 보다 편리한듯, 불편한듯 신기한 부분이 많았던것 같아요!


다들 참고해서 더 나은 빅데이터 분석가가 되어봐요~



여기서 다루지 못한 1999 ANSI 조인문은 다음 포스팅에서 확인하실 수 있습니다!


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



반응형

+ Recent posts