실행계획

8295 단어 SQLPSQLP

Plan Table

아래와 같이 실행계획을 확인해보고자 한다.

EXPLAIN PLAN FOR
  SELECT *
  FROM   emp e, dept d
  WHERE  e.deptno = d.deptno
  AND    e.ename  = 'SMITH';

위 실행계획을 확인하기 위해서 Plan table을 생성하려고 했는데 실패했다.

@$ORACLE_HOME/rdbms/admin/utlxpls.sql
/* 또는 아래와 같이 ?로 $ORACLE_HOME을 대체한다 */
@?/rdbms/admin/utlxpls.sql

아마 이전에 이미 생성해두고 까먹었던가?

SELECT *
FROM all_synonyms
WHERE synonym_name = 'PLAN_TABLE';

원인을 찾아보던 중, 9i 버전 이상에서는 DBMS_XPLAN 패키지를 사용하라는 문구를 발견하였으니,
해당 패키지를 사용하여 보자.

From Oracle 9i onward, you should display execution plans using the DBMS_XPLAN package.
-- ORACLE-BASE




Version Check

현재 오라클 버전을 확인하여 해당 문서를 찾아 DBMS_XPLAN 사용법을 확인해보자.

select * from v$version;




DBMS_XPLAN

Oracle Database Online Documentaion 12c Release 1 > DBMS_XPLAN

사용예시

위 문서에 나온 예제를 따라 실행계획을 확인해보자.

SET LINESIZE 130
SET PAGESIZE 0
SELECT * FROM table(DBMS_XPLAN.DISPLAY);

파라미터 사용

여기에는 3개의 파라미터를 사용할 수 있다.

  • Plan Table 명
  • statement_id (null인 경우 가장 마지막 실행계획)
  • Format option
/* SET STATEMENT ID*/

EXPLAIN PLAN SET statement_id = 'SI0001' FOR
SELECT * FROM emp WHERE ename = 'KING';

SELECT * FROM table(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SI0001')); 

statement_id를 찾을 수 없는 경우, 아래와 같은 에러가 발생한다.

/* SIMPLE */
SELECT * FROM table(DBMS_XPLAN.DISPLAY('PLAN_TABLE', null, 'BASIC')); 




병렬처리 실행계획

다음은 병렬처리에 대한 실행계획이다.

ALTER TABLE emp PARALLEL;

EXPLAIN PLAN for
SELECT /*+ ordered use_has(d) full(d) full(e) noparallel(d) parallel(e 4)*/ 
count(*), min(sal), sum(sal)
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND e.ename    ='hermann'
ORDER BY e.empno;


SET LINESIZE 130
SET PAGESIZE 0
SELECT * FROM table(DBMS_XPLAN.DISPLAY); 

실제 예상과는 다르게 병렬처리가 되지 않은 것으로 보이는데, 추후에 좀 더 알아봐야겠다.

좋은 웹페이지 즐겨찾기