본문 바로가기

SQL/Oracle

실행 계획

실행 계획이란?

 

(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 UPDATEFOR UPDATE 구문 사용시 해당 행에 대한 LOCK 설정 및 해당 행 반환 
 HASHGROUP BY 

GROUP BY 구문 사용 시 HASH 형태의 GROUP BY 수행 

 HASH JOINHASH 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 수행 

  OUTERMERGE OUTER JOIN 수행 
  ANTIMERGE 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

시퀀스 객체 접근 
 SORTAGGREGATE 

추출된 행에 대한 그룹핑 결과를 반환 

  UNIQUE 추출된 행을 정렬하여 중복 값을 제거
 

 GROUP BY

 GROUP BY 구문 사용 시 정렬 형태의 GRUOP BY 수행

  ORDER BY ORDER BY 구문 사용 시 추출된 행에 대한 정렬 수행
 TABLE ACCESSFULL 

접근 경로에 기술한 내용과 동일 

  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