2013년 7월 28일 일요일

(오라클SQL기초튜닝교육)오라클튜닝의 도구 – Explain Plan ,오엔제이프로그래밍실무학원,

자바(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


댓글 없음:

댓글 쓰기