DBAtlas · 데이터베이스 운영 아틀라스

수락되지 않은 SQL plan baseline 계획 evolve

Oracle성능

명령어

-- 1) Plans waiting for acceptance:
SELECT sql_handle, plan_name, origin, enabled, accepted, fixed,
       TO_CHAR(created,'YYYY-MM-DD HH24:MI') AS created
FROM   dba_sql_plan_baselines
WHERE  accepted = 'NO'
ORDER  BY created DESC;

-- 2) Evolve task: test-executes the candidate plan against the accepted plan
VAR tname VARCHAR2(128)
VAR ename VARCHAR2(128)
BEGIN
  :tname := DBMS_SPM.CREATE_EVOLVE_TASK(
              sql_handle => '<sql_handle>',
              time_limit => 600,
              task_name  => 'EVOLVE_<sql_handle>');
  :ename := DBMS_SPM.EXECUTE_EVOLVE_TASK(task_name => :tname);
END;
/

SET LONG 1000000 LONGCHUNKSIZE 1000000 LINESIZE 200 PAGESIZE 0
SELECT DBMS_SPM.REPORT_EVOLVE_TASK(
         task_name => :tname, execution_name => :ename,
         type => 'TEXT', level => 'TYPICAL', section => 'ALL')
FROM   dual;

-- 3) If the report has recommendations (plans proven better), accept them:
SET SERVEROUTPUT ON
DECLARE
  n PLS_INTEGER;
BEGIN
  n := DBMS_SPM.IMPLEMENT_EVOLVE_TASK(task_name => :tname);
  DBMS_OUTPUT.PUT_LINE(n || ' plan(s) accepted');
END;
/
EXEC DBMS_SPM.DROP_EVOLVE_TASK(task_name => :tname);

하는 일

baseline이 있으면 옵티마이저가 찾은 새 계획은 ACCEPTED=NO로 저장된다. evolve 작업은 이 후보들을 accepted 계획과 비교해 테스트 실행하고 확실히 더 나은 계획만 수락한다.

사용 시점

baseline이 있는 SQL에서 새 인덱스나 새 통계로 더 나은 계획이 생겼을 수 있을 때. 자동 SYS_AUTO_SPM_EVOLVE_TASK(12c+)를 기다리지 않고 수동으로 결정하기 위해.

주의

Enterprise Edition이 필요하다. evolve는 SQL을 실제로 실행한다(DML은 쿼리 부분만). 무거운 SQL에는 time_limit을 설정하고 피크 시간을 피한다. ADMINISTER SQL MANAGEMENT OBJECT와 ADVISOR가 필요하다. SYS로 파싱된 SQL은 evolve할 수 없다(ORA-16963). 애플리케이션 사용자로 실행한다.

DBAtlas에서 열기 →

관련 항목