When SQL stataement is complied, the cost-based optimizer determines the execution plan and executes the statement. If SQL Plan Management (SPM is enabled by setting database parameter OPTIMIZER_USE_SQL_PLAN_BASELINES to TRUE (default is FALSE), then the optimizer checks for matching plans. If plans are found, the plan will be used. If not, the execution plan is added to the plan history. Later, you can run the performance comparison for the new plan and accept it if it performs better than selected plan baseline.
OPTIMIZER_USE_SQL_PLAN_BASELINES – enables SPM feature and makes optimizer to lock for plans in SQL plan baseline.
OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES – enables automatic capture of SQL plans.
난이도: ★★★★☆
문제 1: Automatic Capture of SQL plans를 활성화하고, DBA_OBJECTS 뷰에서 하나의 새로운 테이블을 만들고 "WHERE OBJECT_NAME = 'TABLE1'" 조건을 단 쿼리를 실행해 보아라. 실행 계획을 출력하고, OEM 및 Performance view에서 baseline이 생성되었는 지 확인하여라. 그리고, 새로운 테이블의 object_name 컬럼에 인덱스를 생성하고, 같은 쿼리를 수행하고 실행 계획을 확인하라. 새로운 baseline이 생성되었다면, evolve하고 plan을 accept한 다음 같은 쿼리를 다시 한 번 수행해 보고 실행 계획을 확인해 보아라. 실행 계획이 변한 것을 확인하면 정답. (20분)
1. Automatic Capture of SQL plan을 활성화하고, 테이블을 만든 후 쿼리를 실행해본다.
ALTER SYSTEM SET optimizer_capture_sql_plan_baselines=TRUE;
CONN c##ryu/asdf0930k;
DROP TABLE tbl_mv_objects;
CREATE TABLE tbl_mv_objects
AS
SELECT *
FROM dba_objects;
SELECT /* RYU */ *
FROM tbl_mv_objects
WHERE object_name = 'TABLE1';
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR);
2. 인덱스를 생성하고, 실행 계획을 확인해본다.
CREATE INDEX index_01 ON tbl_mv_objects (OBJECT_NAME);
SELECT /* RYU */ *
FROM tbl_mv_objects
WHERE object_name = 'TABLE1';
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR);