아래와 같이 실행계획을 확인해보고자 한다.
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
현재 오라클 버전을 확인하여 해당 문서를 찾아 DBMS_XPLAN 사용법을 확인해보자.
select * from v$version;
Oracle Database Online Documentaion 12c Release 1 > DBMS_XPLAN
위 문서에 나온 예제를 따라 실행계획을 확인해보자.
SET LINESIZE 130
SET PAGESIZE 0
SELECT * FROM table(DBMS_XPLAN.DISPLAY);
여기에는 3개의 파라미터를 사용할 수 있다.
/* 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 /*+ 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);
실제 예상과는 다르게 병렬처리가 되지 않은 것으로 보이는데, 추후에 좀 더 알아봐야겠다.