2012년 10월 23일 화요일

실행계획 데이터베이스 튜닝 - 실행계획분석 05

IN 연산자는 2가지 형태로 실행 계획이 생성될 수 있다.

우선 IN 연산자에 상수가 사용되는 경우만 살펴본다.

CONCATENATION

INLIST

--------------------------------------

CONCATENATION 실행계획

UNION ALL 집합 연산자와 동일한 개념의 실행 계획


SELECT /*+ RULE*/
*
FROM SEND_FILE
WHERE BASE_DATE IN ('20121022', '20120102')
;


SELECT STATEMENT   Cost =
    CONCATENATION
        TABLE ACCESS BY INDEX ROWID SEND_FILE
            INDEX RANGE SCAN SEND_FILE
        TABLE ACCESS BY INDEX ROWID SEND_FILE
            INDEX RANGE SCAN SEND_FILE

위의 실행 계획은 테이블에 엑세스를 두번하여 데이터의 합집합을 추출

IN 절에 인덱스가 이용되면 뒤에서부터 데이터가 추출된다.

---------------------------------------

INLIST 실행계획

SELECT
*
FROM SEND_FILE
WHERE BASE_DATE IN ('20121022', '20120102')
;

SELECT STATEMENT   Cost = 590
    INLIST ITERATOR   
        TABLE ACCESS BY INDEX ROWID SEND_FILE
            INDEX RANGE SCAN SEND_FILE

INLIST 실행 계획은 IN 절에 상수가 몇 개일지라도 테이블에 한 번만 엑세스한다.

------------------------------------------

IN 절이 인덱스를 이용할 경우
INLIST 실행계획은 IN 절의 앞에서부터 데이터를 엑세스하고 추출
CONCATENATION 실행계획은 IN 절의 뒤에서부터 데이터를 엑세스하고 추출

ROWNUM 연산자가 사용될 경우 ROWNUM <= 1
INLIST 실행 계획으로 생성될 경우 1건만 추출
CONCATENATION 실행 계획으로 생성될 경우 만족하는 모든 데이터를 추출한 후에 1건의 데이터만 추출하므로 성능이 저하됨

/*+ NO_EXPAND */ 힌트를 이용하면 CONCATENATION 실행 계획이 생성되지 않는다.

/*+ USE_CONCATE */ 힌트를 이용하면 CONCATENATION 실행 계획이 생성된다.

-------------------------------------

인덱스를 이용하지 못할 경우 IN 연산자는 테이블 전체 스캔




댓글 없음:

댓글 쓰기