EXPLAIN PLAN
FOR SELECT last_name FROM employees;
EXPLAIN PLAN
SET STATEMENT_ID = 'st1' FOR
SELECT last_name FROM employees;
EXPLAIN PLAN
SET STATEMENT_ID = 'st1'
INTO my_plan_table
FOR
SELECT last_name FROM employees;
1) 입력
EXPLAIN PLAN
SET STATEMENT_ID = 'STID1' FOR
SELECT *
FROM EMP A,DEPT B
WHERE B.DEPTNO=10
AND A.DEPTNO=B.DEPTNO
2) 조회
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY('plan_table',NULL,'serial'));
3) 결과
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 270 | 3 |
| 1 | NESTED LOOPS | | 5 | 270 | 3 |
| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 21 | 1 |
|* 3 | INDEX UNIQUE SCAN | PK_DEPT | 4 | | |
|* 4 | TABLE ACCESS FULL | EMP | 5 | 165 | 2 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("B"."DEPTNO"=10)
4 - filter("A"."DEPTNO"=10)
Note: cpu costing is off
1) 입력 : 상동
2) 조회
set markup html preformat on; /*SQLPLUS에서만 작동됨*/
select * from table(dbms_xplan.display());
3) 결과 : 상동
1) 입력 : 상동
2) 조회
* 파라미터 없슴
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
* 파라미터 있슴
SELECT PLAN_TABLE_OUTPUT
FROM TABLE(DBMS_XPLAN.DISPLAY('MY_PLAN_TABLE', 'STID1','TYPICAL'));
3) 결과 : 상동
SELECT
CARDINALITY "Rows"
,COST
,LPAD(' ',LEVEL-1)||OPERATION||' '||OPTIONS||' '||OBJECT_NAME "Plan"
FROM PLAN_TABLE
CONNECT BY PRIOR ID = PARENT_ID
AND PRIOR STATEMENT_ID = STATEMENT_ID
START WITH ID = 0
AND STATEMENT_ID = 'STID3'
ORDER BY ID;
Column | Type | Description |
---|---|---|
STATEMENT_ID | VARCHAR2(30) | EXPLAIN PLAN 명령실행시 입력한 STATEMENT_ID 파라미터 |
PLAN_ID | NUMBER | 데이터베이스내에서 유일한 PLAN_TABLE 로우의 식별자(10G) |
TIMESTAMP | DATE | EXPLAIN PLAN 이 생성된 날짜와 시간 |
REMARKS | VARCHAR2(80) | 사용자입력 코멘트 |
OPERATION | VARCHAR2(30) | INDEX/TABLE ACCESS (4.5.6 참조) |
OPTIONS | VARCHAR2(225) | UNIQUE SCAN/BY INDEX ROWID (4.5.6 참조) |
OBJECT_NODE | VARCHAR2(128) | 원격지의 객체를 참조하는 데이터베이스링크 이름. 병렬처리 로컬 쿼리의 경우는 출력의 순서를 의미 |
OBJECT_OWNER | VARCHAR2(30) | OBJECT를 담고 있는 스키마의 소유주 이름 |
OBJECT_NAME | VARCHAR2(30) | 객체이름(EX:TABLE,INDEX) |
OBJECT_INSTANCE | NUMERIC | 본 쿼리문에 나열된 객체들을 좌에서 우,바깥에서 안쪽으로 순서를 부여한 번호 |
OBJECT_ALIAS | VARCHAR2(65) | 객체 별칭 |
OBJECT_TYPE | VARCHAR2(30) | 객체에 대한 설명적 정보 (EX:UNIQUE,NON-UNIQUE) |
OPTIMIZER | VARCHAR2(255) | 옵티마이져 모드 |
TIME | NUMBER(20,2) | 옵티마이져에 의해 예상된 경과시간. RBO에서는 값이 없다. |
ACCESS_PREDICATES | VARCHAR2(4000) | 엑세스 조건 (EX:"B"."DEPTNO"=10) |
FILTER_PREDICATES | VARCHAR2(4000) | 체크조건 (EX:"A"."DEPTNO"=10) |
TEMP_SPACE | NUMERIC | 옵티마이져가 예측한 임시사용공간(BYTE) |
COST | NUMERIC | 옵티마이져가 예측한 실행비용. 비용은 테이블 엑세스 동작에만 한정된 것은 아니다. 이 칼럼의 값은 특별히 측정단위를 갖는 것은 아니다. 실행계획의 비용을 비교하기 위해 사용되는 가중치를 갖을뿐이다. CPU_COST와 IO_COST의 값 계산에 역할을 한다. |
CARDINALITY | NUMERIC | 옵티마이져가 예측한 엑세스될 로우 수 |
BYTES | NUMERIC | 옵티마이져가 예측한 엑세스될 바이트 수 |
IO_COST | NUMERIC | 옵티마이져가 예측한 IO COST. 읽혀진 데이터블럭 수의 비례치이다. RBO에서는 NULL이다. |
CPU_COST | NUMERIC | 옵티마이져가 예측한 CPU COST. 읽혀진 SYSTEM CYCLES 수의 비례치이다. RBO에서는 NULL이다. |
기 능 | 옵 션 | 설 명 |
---|---|---|
AGGREGATE | GROUP BY | 그룹함수(sum, count 등)를 사용하여 한의 로우가 추출되도록 처리(7버전에서만 표시) |
AND-EQUAL | 인덱스 머지(Merge)를 이용하는 경우 주로나타난다. 복수개의 ROWID집합을 받아들일 때, 집합들간의 교집합을 반환할 때 ,중복로우를 제거할 때 나타나는 OPERATION이다. | |
BITMAP | CONVERSION TO ROWIDS CONVERSION FROM ROWIDS CONVERSION COUNT INDEX SINGLE VALUE INDEX RANGE SCAN INDEX FULL SCAN MERGE MINUS OR AND KEY ITERATION | 비트맵 표현식을 실제 ROWID로 변환한다. ROWID를 비트맵 표현식으로 변환한다. ROWID 갯수를 반환한다. 인덱스에서 싱클키에 대한 비트맵을 검색한다. 키값 범위에 맞는 비트맵을 검색한다. 비트맵을 풀스캔한다 범위스캔의 결과로 나온 복수개의 비트맵을 하나의 비트맵으로 합친다. 비트맵의 비트값을 빼는 연산을 한다. 부정형 조건이 기술된 경우 나타난다. 두개의 비트맵에 대해 OR연산을 한다. 두개의 비트맵에 대해 AND연산을 한다. 테이블에서 각각의 로우를 취해 비트맵 인덱스에서 대응되는 비트맵을 찾은 후 BITMAP MERGE 에 의해 하나의 비트맵으로 만든다 |
CONNECT BY | CONNECT BY 를 사용하여 트리(Tree)구조로전개 | |
CONCATENATION | 단위 액세스에서 추출한 로우들의 합집합을 생성 | |
COUNTING | 테이블의 로우스를 센다 | |
FILTER | 선택된 로우에 대해서 다른 집합에 대응되는 로우가 있다면 제거하는 작업 | |
FIRST ROW | 조회 로우 중에 첫번째 로우만 추출한다. | |
FOR UPDATE | 선택된 로우에 LOCK을 지정한다. | |
INDEX | RANGE SCAN RANGE SCAN DESCENDING FULL SCAN FULL SCAN DESCENDING FAST FULL SCAN SKIP SCAN | 인덱스의 일정범위 ROWID를 오름차순 검색. 인덱스의 일정범위 ROWID를 내림차순 검색 인덱스에 있는 모든 ROWID를 오름차순 검색한다. 인덱스에 있는 모든 ROWID를 내림차순 검색한다. 멀티블럭 I/O를 통해 인덱스된 칼럼만을 대상으로 모든 ROWID 검색한다. CBO에서만 가능. 결합인덱스의 첫번째 칼럼의 값이 없을때 인덱스의 ROWID를 검색한다. 9i. CBO에서만 가능 |
INTERSECTION | 교집합의 로우를 추출한다. (같은 값이 없다.) | |
MERGE JOIN | . OUTER ANTI SEMI CARTESIAN | 두개의 집합이 각각 특정 값으로 정렬되어 있으며,한 집합의 로우는 매칭되는 다른 집합의 로우와 결합시킨 결과를 반환한다. 먼저 자신의 조건만으로 액세스한 후 각각을 SORT하여 머지(Merge)해 가는 조인 outer join을 한다. 머지안티조인 머지세미조인 조인조건 없는 머지조인 |
MINUS | MINUS 함수를 사용한다. | |
NESTED LOOPS | OUTER | 먼저 어떤 드라이빙(Driving) 테이블의 로우를 액세스한 후 그 결과를 이용해 다른 테이블을 연결하는 조인, outer join을 한다. |
PROJECTION | 내부적인 처리의 일종 | |
REMOTE | 다른 분산 데이터베이스에 있는 오브젝트를 추출하기 위해 DataBase Link를 사용하는 경우 | |
SEQUENCE | Sequence 를 액세스한다. | |
SORT | AGGREGATE UNIQUE GROUP BY JOIN ORDER BY | 선택된 로우들을 그룹함수를 이용하여 하나의 로우로 만들때 결과집합 정렬하여 중복로우를 제거할 때 결과집합을 정렬하여 GROUP BY 절을 사용하여 그룹핑할 때 결과집합을 정렬하여 MERGE JOIN할 때 ORDER BY 를 위한 SORT |
TABLE ACCESS (물리뷰의 경우 MAT_VIEW REWITE ACCESS 로 나타난다) | FULL SAMPLE CLUSTER HASH BY ROWID RANGE SAMPLE BY ROWID RANGE BY USER ROWID BY INDEX ROWID BY GLOBAL INDEX ROWID BY LOCAL INDEX ROWID | 테이블의 모든 로우를 검색한다. 테이블에서 샘플로우만을 검색한다. indexed cluster key 값에 근거하여 로우를 검색한다. hash cluster key 값에 근거하여 로우를 검색한다. ROWID 범위검색 ROWID 범위로 샘플데이터 검색 테이블의 로우가 사용자가 제공한 ROWID에 위치하고 있을 때 사용 파티션되지 않은 테이블에 인덱스를 이용하여 로우 검색 파티션된 테이블에서 글로벌인덱스를 이용하여 로우검색 파티션된 테이블에서 로컬인덱스를 이용하여 로우검색 |
UNION | 두집합의 합집합을 구한다.(중복없음) 항상 전체범위처리를 한다. | |
UNION ALL | 두집합의 합집합을 구한다.(중복없음) UNION 과는 다르게 부분범위 처리를 한다. | |
VIEW | 어떤 처리에 의해 생성되는 가상의 집합에서 추출한다.주로 서브쿼리(Subquery)에 의해 수행된 결과 |
- 강좌 URL : http://www.gurubee.net/lecture/2473
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.