우선 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')
;
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 연산자는 테이블 전체 스캔
댓글 없음:
댓글 쓰기