반응형

안녕하세요


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



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



하지만!


이번 포스팅에서는


가장 중요한 두 가지!


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

반응형
반응형

안녕하세요! 


오늘은

인덱스에 대해 알아보겠습니다.



책에는 목차, 즉 인덱스가 있습니다.

우리는 책의 내용을 찾을 때 이 인덱스를 이용하죠~


SQL 인덱스는 책의 목차와 같은 기능을 합니다.


따라서 인덱스를 검색 속도를 높이기 위해 사용할 수 있습니다.


예제를 통해 인덱스에 대해 알아보도록 하겠습니다.


예제를 위한 테이블입니다.


[ 고객 테이블 ]


고객이름

 나이

  주소 

 총구매액

 전화번호

 추천인

 A

 24

 서울

 30000

 010-0123-4567

 null

 B

 29

 서울

 10000

 010-1234-5678

 A

 C

 26

 파주

 25000

 010-2345-6789

 A

 D

 27

 제주

 1000

 010-3456-7891

 B




우선 인덱스 생성 방식은 2가지 방법이 있습니다.



     자동으로 생성:


        테이블 정의에서 primary key 또는 unique 제약 조건을

        정의하면 공의 인덱스가 자동으로 생성됩니다.



     수동으로 생성:


         행에 엑세스하는 속도를 높이기 위해 유저가

         열의 비고유 인덱스를 생성할 수 있습니다.




예제1. 고객이름 컬럼에 인덱스를 생성하세요.




여기서 잠깐!

인덱스를 생성할 때 주의할 점이 있습니다.


우선 인덱스는 검색할 때 꼭 필요한 컬럼에만 인덱스를 걸어줘야 합니다.


자주 사용되는 컬럼에 인덱스를 생성하면 좋겠죠?



하지만


테이블에 인덱스가 많은 경우,

또한 자주 생성, 갱신, 삭제되는 테이블의 경우


인덱스를 생성하면


DML작업 후에 모든 인덱스를 갱신해야하므로

서버의 부담이 늘어납니다.



예제2. 고객 이름, 나이, 주소, 전화번호를 검색할 때 인덱스를 이용하세요.




인덱스를 사용하는 SQL 작성 방법 2가지가 있습니다.



     1. WHERE절 검색에 사용되는 컬럼에 인덱스가 존재하는지

         확인해야한다.


     2. WHERE절 검색에 사용되는 컬럼을 가공하면

         FULL TABLE SCAN을 한다.


     3. WHERE절 검색에 사용되는 컬럼이 가공되지 않았는데도

        인덱스를 엑세스하지 못하는 경우에 암시적 형변환 여부를

        확인해봐야 한다.



인덱스를 생성한 후


쿼리문에서 인덱스를 활용하기위해서는


WHERE절 검색에 인덱스가 존재하는 컬럼을 명시해주어야 합니다.



예제3. 고객이름, 총구매액, 추천인을 검색하는데

총구매액이 가장 높은 고객을 검색하세요.




위와 같이 두가지 또는 세가지의 쿼리의 방법이 있습니다.


과연 어떤 방법이 가장 빠를까요?


여기서 각 쿼리별 시간을 추적해보겠습니다.


 저는 SQLPLUS를 사용하는데요


SQLPLUS명령창에 SET TIMING ON이라는 명령어를 사용하면 시간을 추적할 수 있습니다.


<SQL3 쿼리 시간>




<SQL4_2 쿼리 시간>




<SQL4_3 쿼리 시간>




위의 테이블은 예제를 위해 사용한 테이블과 동일한 DATA를 가진 고객 테이블입니다.


00:00:00.03 의 시간차이를 사소하다고 생각할 수 있습니다.


하지만


빅데이터라면?


만약 천만배, 백만배 이상의 데이터가 존재한다면 그 시간의 차이는 어마어마할 것입니다.



빅데이터를 다루는 분석가는


특히 데이터의 검색 속도를


높일 수 있는 쿼리를 사용해야한답니다~




오늘은 여기까지!


검색의 속도를 높이는 하나의 강력한 방법! 인덱스에 대해 알아보았습니다~



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


#빅데이터분석 #SQL #오라클 #인덱스 #서브쿼리 #검색속도 #빠른검색 #HINT #SET_TIMING_ON

반응형

'SQL' 카테고리의 다른 글

ORACLE | 다중 INSERT문 4가지 방법  (0) 2018.04.17
ORACLE | 치환변수(&) 사용하는 방법  (0) 2018.04.16
ORACLE | VIEW(뷰)  (0) 2018.04.11
ORACLE | SQL제약조건(데이터 정제하기)  (0) 2018.04.10
ORACLE | MERGE문 (DML)  (0) 2018.04.09

+ Recent posts