1. 통계정보 수집

ANALYZE TABLE SJ_USER.COM_BOARD COMPUTE STATISTICS;     -- 해당 Table의 Table, Index, Cluster 개체 모두 통계 정보를 수집한다.
ANALYZE INDEX SJ_USER.IDX_SORT COMPUTE STATISTICS;      -- 해당 Index에 대한 통계 정보만 수집한다.

EXEC DBMS_STATS.GATHER_TABLE_STATS ('SJ_USER', 'COM_BOARD');

 

2. 수집된 통계정보 조회

SELECT TO_CHAR(T.LAST_ANALYZED, 'YYYY-MM-DD HH24:MI:SS'), T.*
FROM USER_TABLES T
WHERE T.TABLE_NAME = 'COM_BOARD';


SELECT TO_CHAR(T.LAST_ANALYZED, 'YYYY-MM-DD HH24:MI:SS'), T.*
FROM USER_INDEXES T
WHERE T.TABLE_NAME = 'COM_BOARD';

* 통계 정보 수집후 실행 계획 돌려보면 실행 계획이 반영된다.
  즉 비용기반 옵티마이저가 실행계획 수립을 위한 기초 데이터가 통계정보이므로 주기적인 Analyze가 수행되어야 한다. 

 

3. ORACLE 10g부터는 통계정보가 자동수집 된다.
-- 자동통계정보 DISABLE 하기(11g에서는 아래의 JOB명으로 등록된 것이 없다. 확인필요하다. 단지 사용법만 참고하자)

EXEC DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');

- 통계정보상태 확인하기
SELECT  JOB_NAME
,       ENABLED
,       SCHEDULE_NAME
,       STATE 
FROM DBA_SCHEDULER_JOBS ; 

 

4. 실행계획 저장 PLAN_TABLE 생성

create table PLAN_TABLE (
        statement_id       varchar2(30),
        plan_id            number,
        timestamp          date,
        remarks            varchar2(4000),
        operation          varchar2(30),
        options            varchar2(255),
        object_node        varchar2(128),
        object_owner       varchar2(30),
        object_name        varchar2(30),
        object_alias       varchar2(65),
        object_instance    numeric,
        object_type        varchar2(30),
        optimizer          varchar2(255),
        search_columns     number,
        id                 numeric,
        parent_id          numeric,
        depth              numeric,
        position           numeric,
        cost               numeric,
        cardinality        numeric,
        bytes              numeric,
        other_tag          varchar2(255),
        partition_start    varchar2(255),
        partition_stop     varchar2(255),
        partition_id       numeric,
        other              long,
        distribution       varchar2(30),
        cpu_cost           numeric,
        io_cost            numeric,
        temp_space         numeric,
        access_predicates  varchar2(4000),
        filter_predicates  varchar2(4000),
        projection         varchar2(4000),
        time               numeric,
        qblock_name        varchar2(30),
        other_xml          clob
);

 

5. PLAN_TABLE 테이블 생성 후 수행 속도 향상과 동일한 statement_id가 생성되는 것을  방지하기 위해 index를 생성

CREATE UNIQUE INDEX plan_index ON PLAN_TABLE(statement_id, id); 

 

6. 실행계획 수립할 sql구문 분석

EXPLAIN PLAN SET STATEMENT_ID='a1' FOR 
select  mnu_uid
,       bod_uid
,       bod_subject
,       bod_ref
,       bod_level
,       bod_order
from com_board
where mnu_uid = 142
and bod_ref > 0;

 

7. 수립된 실행 계획 정보 조회

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);


SELECT LPAD(operation,LENGTH(operation)+ 2*(LEVEL-1)) ||DECODE(id,0,'cost  estimate:' ||
       DECODE(position,'0','N/A',position),null) || ' ' ||options || DECODE(object_name,null,null,':') ||
       RPAD(object_owner, LENGTH(object_name)+1,',') || object_name ||
       DECODE (object_type,'UNIQUE' ,'(U) ','NON_UNIQUE','(NU)',null) || 
       DECODE(object_instance,null,null,'('||object_instance||')')  "Explain Plan"
FROM PLAN_TABLE
START WITH ID= 0 and STATEMENT_ID = :id
CONNECT by prior ID=PARENT_ID and STATEMENT_ID=:id;

* 이렇게 수동으로 실행계획 수립하는거나, Oracle Developer에서 제공하는 '실행 계획'으로 조회 하나 결과는 같다.