실행 계획이란?
(1) 접근 경로의 이해
- SCAN : 데이터를 읽는 작업, SCAN을 수행하는 방식을 일컬어 접근경로 (ACCESS PATH)라 한다.
FULL SCAN : 테이블의 전체 데이터를 읽어 조건에 맞는 데이터를 추출
ROWID SCAN : ROWID를 기준으로 데이터를 추출하는 방식으로, 단일 행에 접근하는 방식 가운데서 가장 빠름
INDEX SCAN: 원하는 데이터를 추출하기 위하여 인덱스를 사용하여 검색
INDEX SCAN의 종류
종류 |
설명 |
INDEX UNIQUE SCAN |
UNIQUE INDEX를 이용하여 필요한 데이터 블록을 접근하는 방식 한 건이하의 ROWID를 반환하는 INDEX SCAN 방식 |
INDEX RANGE SCAN |
인덱스 이용하여 필요한 데이터 블록을 접근하는 방식 중 가장 일반적인 형태 한 건 이상의 필요한 데이터가 포함된 일정 범위의 인덱스 블록을 오름차순으로 접근하는 방식 동일 INDEX KEY 값에 대해서는 ROWID 기준으로 오름차순 정렬 |
INDEX RANGE SCAN DECENDING |
INDEX RANGE SCAN과 기본적인 접근방식은 동일 오름차순이 아닌 내림차순으로 인덱스 블록을 접근하는 방식 |
INDEX SKIP SCAN |
결합 인덱스의 선행 컬럼을 건너뛰는 형태로 인덱스 블록에 순차적으로 접근 결합 인덱스 선행 컬럼의 중복을 제거한 값의 종류가 적을경우 FULL TABLE SCAN보다 효과적일 수 있음 |
INDEX FULL SCAN |
인덱스 리프 블록 전체를 SCAN하는 방식 단일 블록을 순차적으로 접근하므로 인덱스 키 순으로 정렬 보장 병렬처리 불가능 |
INDEX FAST FULL SCAN |
인덱스 리프 블록전체를 SCAN하는 방식 병렬 처리가 가능하나 인덱스 키 순으로 정렬은 보장 불가능 |
INDEX JOIN |
두 개 이상의 인덱스를 SCAN한 후 ROWID 끼리 HASH JOIN 하는 방식 인텍스 키 순으로 정렬 보장 불가능 |
BITMAP INDEX |
인덱스 키 값에 BITMAP 정보와 각각의 비트 위치 정보를 ROWID로 변환해주는 매핑 기능을 이용하여 블록에 접근 AND 또는 OR 조건을 처리하기 위해 BOOLEAN 연산을 사용 |
FULL TABLE SCAN을 타는 경우
- 조건절에서 비교한 컬럼에 인덱스가 없을때
- 조건절에서 비교한 컬럼에 인덱스는 있으나, 조건을 만족하는 데이터가 테이블의 많은 양을 차지하여 FULL TABLE SCAN의 비용이 INDEX SCNA보다 적다고 판단
- 조건절에서 비교한 컬럼에 인덱스는 있으나, 테이블 데이터 자체가 적어 FULL TABLE SCAN의 비용이 INDEX SCAN보다 적다고 판단하는 경우
- 테이블 생성시 설정한 DEGREE 속성 값이 크게 설정되어 있는 경우
ROWID SCAN을 선택하는 경우
- 조건절에 ROWID를 직접 명시하는 경우
- IDNEX SCAN을 통해 ROWID를 추출한 후 테이블에 접근할 경우
ROWID는 테이블에 저장괸 각각의 행이 갖는 주소를 의미, 16진수로 표현되는 값이다.
INDEX SCAN을 선택하는 경우
종류 |
선택 기준 |
INDEX UNIQUE SCAN |
UNIQUE INDEX를 구성하는 모든 컬럼이 조건절에 =로 명시된 경우 |
INDEX RANGE SCAN |
INDEX UNIQUE SCAN을 제외한 모든 INDEX SCAN에서 사용되며 UNIQUE 성격의 결합 인덱스의 선두 컬럼이 WHERE절에 사용되거나 일반 인덱스의 컬럼이 WHERE절에 존재하는 경우 COL = :B1 CO1 < B1 COL1 > B1 COL1 = :B1 AND COL2 < :B2
와일드 카드 문자(%)가 조건 값의 뒤에 존재하는 경우 LIKE 'ABC%' |
IDNEX RANGE SCAN DECENDING |
INDEX RANGE SCAN을 수행함과 동시에 ORDER BY DESC절을 만족하는 경우 |
INDEX SKIP SCAN |
결합 인덱스 선행 컬림이 WHERE절에 없는 경우 옵티마이저가 INDEX SKIP SCAN 이 FULL TABLE SCAN보다 빠르다고 판단되는 경우 |
INDEX FULL SCAN |
ORDER BY/ GROUP BY의 모든 컬럼이 인덱스 전체 또는 일부로 정의된 경우 정렬이 필요한 명령에서 INDEX ENTRY를 순차적으로 읽는 방식으로 처리 일반적으로 INDEX SCAN후 TABLE SCAN이 동반 |
INDEX FULL SCAN DESCENDING |
INDEX FULL SCAN을 수행함과 동시에 ORDER BY DESC절을 만족하는 경우 |
INDEX FAST FULL SCAN |
FULL TABLE SCAN을 하지 않아도 INDEX FAST FULL SCAN으로 원하는 데이터 추출할 수 있고 추출된 데이터의 정렬이 불필요한 경우 결합 인덱스를 구성하는 컬럼 중 최소 한 개이상은 NOT NULL이어 야 함 |
INDEX JOIN |
추출하고자 하는 데이터가 조인하는 인덱스에 모두 포함되어 있고, 추출되는 데이터의 정렬이 필요 없는 경우 |
실행 계획 내 주요 OPERATION
실행 계획상의 OPERATION별 옵션
OPERATION |
옵션 |
설명 |
AND-EQUAL |
- |
ROWID를 포함한 다수의 집합을 서로 비교하여 중복 제거 각각의 집합에 모두 존재하는 ROWID만 추출해내는 OPERATION 주로 단일 컬럼 인덱스 접근 경로에서 사용 |
BITMAP |
CONVERSION |
ROWID를 BIMAP 형태로 변환하는 OPERATION을 의미 |
|
OR |
두 개의 BITMAP을 비트 단위의 OR 연산 수행 |
|
AND |
두 개의 BITMAP을 비트 단위의 AND 연산 수행 |
CONNECT BY |
- |
CONNECT BY 구문이 사용된 쿼리에서 계층 순서로 데이터 수행 처리 |
CONCATENATION |
- |
UNION ALL 구문 사용시 해당 집합의 합집합 생성 |
COUNT |
- |
테이블로부터 추출한 데이터에 대한 COUNT 수행 |
COUNT |
STOPKEY |
테이블로부터 추출한 데이터에 대해 WHERE절의 ROWNUM 조건에 명시한 수치까지만 COUNT수행 |
FILTER | - |
하위 단계에서 반환된 행 중에 특정 조건에 맞는 데이터만 추출 |
FIRST ROW | - |
추출한 행 중에 첫 번째 행만 반행 |
FOR UPDATE | - | FOR UPDATE 구문 사용시 해당 행에 대한 LOCK 설정 및 해당 행 반환 |
HASH | GROUP BY |
GROUP BY 구문 사용 시 HASH 형태의 GROUP BY 수행 |
HASH JOIN | - | HASH JOIN수행 |
ANTI |
HASH (LEFT) ANTI JOIN 수행 | |
SEMI |
HASH (LEFT) SEMI JOIN 수행 | |
RIGHT ANTI |
HASH RIGHT ANTI JOIN 수행 | |
|
RIGHT SEMI |
HASH RIGHT SEMI JOIN 수행 |
OUTER | HASH (LEFT) OUTER JOIN 수행 | |
RIGHT OUTER |
HASH RIGHT OUTER JOIN 수행 | |
INDEX |
UNIQUE SCAN |
접근 경로에서 기술한 내용과 동일 |
RANGE SCAN | ||
RANGE SCAN DESCENDING |
||
FULL SCAN | ||
INTERSECTION |
- |
두 집합 간의 교집합을 추출하고 중복제거 |
MERGE JOIN |
- |
MERGE JOIN 수행 |
OUTER | MERGE OUTER JOIN 수행 | |
ANTI | MERGE ANTI JOIN 수행 | |
SEMI | MERGE SEMI JOIN 수행 | |
CARTESIAN | 조인 조건이 없는 경우 발생, 각각의 집합이 N,M 건이 경우, 조건 결과 건수는 N *M 건으로 증가 | |
MINUS |
- |
첫 번째 집합에서 두 번째 집합에 속한 행을 제거 |
NESTED LOOPS |
- |
NESTED LOOP JOIN 수행 |
OUTER | NESTED LOOP OUTER JOIN 수행 | |
PARTITION |
- | 파티션 접근 |
SINGLE |
단일 파티션만 접근 | |
ITERATOR | 다수의 파티션을 접근 | |
ALL |
전체 파티션을 접근 | |
INLIST |
ITERATOR와 유사하나, IN 절에 명시된 파티션을 접근 | |
REMOTE | - |
DB LINK로 연결된 원격지 데이터베이스 접근 |
SEQUENCE |
- | 시퀀스 객체 접근 |
SORT | AGGREGATE |
추출된 행에 대한 그룹핑 결과를 반환 |
UNIQUE | 추출된 행을 정렬하여 중복 값을 제거 | |
GROUP BY |
GROUP BY 구문 사용 시 정렬 형태의 GRUOP BY 수행 | |
ORDER BY | ORDER BY 구문 사용 시 추출된 행에 대한 정렬 수행 | |
TABLE ACCESS | FULL |
접근 경로에 기술한 내용과 동일 |
BY INDEX ROWID | 인덱스의 ROWID를 통한 테이블의 데이터를 추출 | |
BY GLOBAL INDEX ROW ID |
파티션이 되지 않은 글로벌 인덱스의 ROWID를 통한 테이블 데이터 추출 | |
BY LOCA INDEX ROW ID |
파티션이 된 로컬 인덱스의 ROWID를 통한 테이블의 데이터 추출 | |
UNION |
- | 두 집합의 합집합을 생성, 중복 제거 |
VIEW | - |
뷰나 인라인 뷰를 사용한 데이터 추출 |