자바(JAVA),Oracle 관련 개발에서 쿼리문(SQL) 성능은 중요한 부분 입니다. 그 기초가 되는것이 SQL문장의 실행계획을 해석하는 것이죠, 그 방법중 하나인 Explain plain 명령입니다. 요즘은 Toad, Orange등을 사용하니 필요 없을 수 있지만 서버쪽에서 직접 해야하는 경우엔 SQL*Trace와 같이 가금 사용되는 도구 입니다.
구로디지털 오엔제이프로그래밍실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크 실무 전문 강의)
Explain Plan은 실행 계획을 사용자에게 제공하는 명령 입니다. SQL문이
처음 실행될 때 서버 프로세스가 파싱을 한 후 SQL문법에 대한 오류를 확인하고 데이터 딕셔너리를 통해
권한이나 객체에 대한 확인 작업을 거친 후 해당 SQL문장이 어떻게 실행 될 것인가에 대해 결정을 하게
되는데 이 결과를 실행 계획(execution Plan)이라 하며 이 결과를 확인 할 수 있는 도구가 Explain Plan 입니다.
Explain Plan을 통해 SQL문이 실행 될 때의 상태 정보를
확인 할 수 있으며 실행 계획은 실행 계획 테이블(PLAN_TABLE)에 저장 됩니다.
아래의 예문을 보죠.
Explain Plan 명령을 사용 하기 위해서는 SQL을 분석한 결과를
저장 할 테이블(PLAN_TABLE)이 있어야 합니다. $ORACLE_HOME\rdbms\admin\utlxplan.sql
이라는 파일을 통해 생성을 하면 됩니다.
기본 문법은 다음과 같습니다.
Explain
Plan
[Set
statement_id = ‘사용자가 지정한 아이디’]
[into
테이블명]
For
SQL문장…
statement_id : SQL문에 대한 아이디를 줌으로써 다른
사용자의 것과 구분이 가능
데이블명 : 실행 계획을 저장 할 테이블 명, 별도로 지정 하지 않으면 PLAN_TABLE
SQL문장 : 실행 계획을
분석 하고자 하는 SQL문
SQL> @d:\app\A\product\11.2.0\dbhome_1\RDBMS\ADMIN\utlxplan.sql
테이블이 생성되었습니다.
SQL>
explain plan
2 set statement_id='1'
3 for select ename, sal, deptno
4 from emp
5 where empno = 7369;
해석되었습니다.
SQL> select rtrim(lpad(' ',2*level) ||
2 rtrim(operation) || ' ' ||
3 rtrim(options) || ' ' || object_name)
query_plan ,
4 cost,
5 cardinality
6 from plan_table
7 start with id=0 and statement_id='1'
8 connect by prior id = parent_id and
statement_id = '1';
QUERY_PLAN COST CARDINALITY
----------------------------------------
---------- -----------
SELECT STATEMENT 2 1
TABLE ACCESS BY INDEX ROWID EMP 2 1
INDEX UNIQUE SCAN EMP_PK 1 14
물론 아래처럼 Oracle에서 제공하는 utlxplp.sql 파일을 이용하여 PLAN_TABLE의 내용을
확인 할 수도 있습니다.
SQL> @d:\app\A\product\11.2.0\dbhome_1\RDBMS\ADMIN\utlxplp.sql
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------
---------------------------------------------------------------------------
| Id
| Operation
| Name | Rows
| Bytes | Cost |
---------------------------------------------------------------------------
| 0
| SELECT STATEMENT | | 1 |
17 | 2 |
| 1
| TABLE ACCESS BY INDEX ROWID| EMP |
1 | 17 | 2 |
|* 2
| INDEX UNIQUE SCAN | EMP_PK |
14 | | 1 |
---------------------------------------------------------------------------
Predicate Information (identified by
operation id):
---------------------------------------------------
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------
2
- access("EMP"."EMPNO"=7369)
Note: cpu costing is off
15 개의 행이 선택되었습니다.
[출처]오라클자바커뮤니티
www.oraclejavacommunity.co.kr
[출처]오라클자바커뮤니티
www.oraclejavacommunity.co.kr
댓글 없음:
댓글 쓰기