실행 계획이란?
(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 | - | 뷰나 인라인 뷰를 사용한 데이터 추출 |
'SQL > Oracle' 카테고리의 다른 글
집계와 조건분기 (0) | 2019.05.24 |
---|---|
옵티마이저 (0) | 2017.11.15 |
컬럼 속성(무결성 제약조건) (0) | 2017.11.15 |
4.오라클 식구들(데이터베이스 객체) (0) | 2017.11.15 |