기술노트 49 회 SQL PLAN MANAGEMENT Author 윤병길과장 Creation Date Last Updated Version 1.0 Copyright(C) 2009 Goodus Inc. All Rights Reserved

Similar documents
SQL PLAN MANAGEMENT 활용 엑셈컨설팅본부 /DB 컨설팅팀장정민 개요 오라클은비롯한많은관계형 DBMS 에서는사용자의 SQL 질의를효율적으로처리하기위해옵티마이저를사용하고있다. 옵티마이저는유저가수행하는 SQL 을받아실행계획을생성하고, 실제 SQL 은이실행계획을

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터

ePapyrus PDF Document

歯sql_tuning2

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

Oracle Database 10g: Self-Managing Database DB TSC

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

대량의 DML 작업에대한성능개선방안 엑셈컨설팅본부 /DB 컨설팅팀박준연 개요 대량의데이터를변경해야하는작업은그자체만으로도큰부담으로다가온다. 하지만변경작업자체에만국한되는것이아니라변경되기전데이터와변경이후데이터를각각저장관리해야하는메커니즘이라면성능을개선해야하는입장에서는더욱큰부담

PowerPoint 프레젠테이션

Tablespace On-Offline 테이블스페이스 온라인/오프라인

PowerPoint Presentation

10.ppt

Microsoft Word - [Unioneinc] 특정컬럼의 통계정보 갱신_ _ldh.doc

13주-14주proc.PDF

Result Cache 동작원리및활용방안 엑셈컨설팅본부 /DB 컨설팅팀김철환 개요 ORACLE DBMS 를사용하는시스템에서 QUERY 성능은무엇보다중요한요소중하나이며그 성능과직접적인관련이있는것이 I/O 이다. 많은건수를 ACCESS 해야만원하는결과값을얻을수있는 QUER

Microsoft Word - SQL튜닝_실습교재_.doc

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

MS-SQL SERVER 대비 기능

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r

MySQL-.. 1

Commit_Wait / Commit_Logging 두파라미터를통해 Log File Sync 대기시간을감소시킬수있다는것은놀라움과의아함을동시에느낄수있다. 단지파라미터의수정을통해당연히대기해야하는시간을감축한다는것은분명성능을개선해야하는입장에서는놀라운일이될것이다. 반면, 그에따

The Self-Managing Database : Automatic Health Monitoring and Alerting

슬라이드 1

90

untitled

1217 WebTrafMon II

그리고.. 엑셀에하나둘완료된쿼리가늘어날때마다... 희열을느낀다... 이글을보는당신은어떻게할것인가? A 군의판단이잘못된것인가? 잘못된판단이아니다최선의판단이다... 11g 전까지는... 11g New Feature 인 Pending Statistics 를 SPA 와함께사용

DB 성능고도화핵심원리 비투엔컨설팅 수석컨설턴트 조시형

문서 템플릿

Microsoft PowerPoint - 10Àå.ppt

배치프로그램에서튜닝대상 SQL 추출하기 엑셈컨설팅본부 /DB 컨설팅팀박성호 배치프로그램의성능문제를진단하기위해트레이스를사용할수없고, 개별 SQL 에대한성 능점검은비효율적인경우에어떻게배치프로그램의성능문제를제대로파악하고개선안을도 출할것인가? 복잡한로직을가지고있는프로그램 (

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

最即時的Sybase ASE Server資料庫診斷工具

DBMS & SQL Server Installation Database Laboratory

Jerry Held

NLJ BATCH 과부분범위처리 엑셈컨설팅본부 / DB 컨설팅팀오수영 개요 오라클은새로운버전이출시될때마다한층업그레이드된기능들이추가된다. 이기능들은사용자에게편리함을제공함은물론이고, 기존의기능들이성능적으로업그레이드되어보다강력해지기도한다. 그러나때로는새롭게추가된기능으로인해,

강의 개요

untitled

목 차

Spring Boot/JDBC JdbcTemplate/CRUD 예제

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

TECHNICAL WHITE PAPER Tibero Optimizer SQL Execution Plan October 2012

윈도우시스템프로그래밍

Tina Admin


歯FDA6000COP.PDF

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

PRO1_09E [읽기 전용]

결과보고서

MySQL-Ch10

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역

휠세미나3 ver0.4

Slide 1

Microsoft PowerPoint - Oracle Data Access Pattern.ppt

PowerPoint 프레젠테이션

62

Data Sync Manager(DSM) Example Guide Data Sync Manager (DSM) Example Guide DSM Copyright 2003 Ari System, Inc. All Rights reserved. Data Sync Manager

PowerPoint Presentation

Simplify your Job Automatic Storage Management DB TSC

ORACLE EXADATA HCC 압축방식이해하기 엑셈컨설팅본부 /DB 컨설팅팀김철환 개요 시간이지나면서데이터는급속하게증가하고있다. 데이터가증가함에따라 DBMS 에서관리되어지는정보도급속하게증가하고있다. 이로인해저장공간의부족으로하드웨어비용의증가와데이터처리성능에많은문제점들

BSC Discussion 1

MaxGauge( 맥스게이지 ) 를이용한 SQL 모니터링, 진단 / 분석및튜닝가이드 엑셈

<4D F736F F D203033C6C4C6BCBCC72DB8AEBFC0B1D7B9E6B9FD2E646F63>

Contents Data Mart 1. 개요 실습방향 테스트위한사전설정 본격실습시작 ) 데이터파일 dd 명령어로 백업수행및유실시키기 ) 장애복구수행 결론...7 페이지 2 / 7

PowerChute Personal Edition v3.1.0 에이전트 사용 설명서

Chap06(Interprocess Communication).PDF

intro

원장 차세대 필요성 검토

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

PowerPoint Presentation

PowerPoint 프레젠테이션

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

Jerry Held

thesis

Intra_DW_Ch4.PDF

SQL Tuning Business Development DB SQL - -SQL -SQL

윈백및업그레이드 Tibero Flashback 가이드

로거 자료실

ALTIBASE HDB Patch Notes

3 S Q L A n t i p a t t e r n s Trees/intro/parent.sql CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, parent_id BIGINT UNSIGNED, comment TEXT

(Microsoft PowerPoint - 5\300\345.\271\256 \303\263\270\256\(8\301\266\).ppt)

R50_51_kor_ch1

초보자를 위한 분산 캐시 활용 전략

Microsoft PowerPoint - 27.pptx

4 CD Construct Special Model VI 2 nd Order Model VI 2 Note: Hands-on 1, 2 RC 1 RLC mass-spring-damper 2 2 ζ ω n (rad/sec) 2 ( ζ < 1), 1 (ζ = 1), ( ) 1

FlashBackt.ppt

Microsoft Word - FunctionCall

NoSQL

SQL Server 에서 SQL 튜닝시알아야할힌트와사용 방법 엑셈컨설팅본부 /DB 컨설팅팀박성호 Optimizer 가 SQL 을해석할때항상최적의실행계획을생성하지는못한다. 복잡한 SQL 일수록최적의실행계획을생성하기위해고려해야할대상 (Table, Index 가많은경우 )

예제 1.1 ( 관계연산자 ) >> A=1:9, B=9-A A = B = >> tf = A>4 % 4 보다큰 A 의원소들을찾을경우 tf = >> tf = (A==B) % A

Microsoft Word - ASG AT90CAN128 모듈.doc

PWR PWR HDD HDD USB USB Quick Network Setup Guide xdsl/cable Modem PC DVR 1~3 1.. DVR DVR IP xdsl Cable xdsl Cable PC PC DDNS (

< 그림 1> Nested Loop Join - 이너테이블에인덱스가있을경우 < 그림 2> Nested Loop Join - 이너테이블에인덱스가없는경우 간은느리다. 즉첫번째로우를받을준비가되어있는단계까지를실행시간으로볼때실행시간은빠르나 Fetch 시간은느리다. NLJ는메모리

KEEP BUFFER 활용방안 엑셈컨설팅본부 /DB 컨설팅팀장정민 개요 Oracle 은유저가요청한작업을빠르게처리하기위해 Buffer Cache 라는것을사용한다. Buffer Cache 는 SGA 에위치하고있으며, 오라클인스턴스에접속하는모든프로세스에의해공유된다. 이 Bu

PowerPoint Template

6주차.key

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Transcription:

기술노트 49 회 SQL PLAN MANAGEMENT Author 윤병길과장 Creation Date 2010-06-01 Last Updated Version 1.0 Copyright(C) 2009 Goodus Inc. All Rights Reserved

Contents 1. SQL PLAN MANAGEMENT OVERVIEW... 3 1.1. INTRODUCTION... 3 1.2. SQL PLAN MANAGEMENT 주요구성요소... 3 2. SQL PLAN MANAGEMENT... 4 2.1. SPM 동작원리... 5 2.2. AUTOMATIC PLAN CAPTURE... 5 2.3. MANUAL PLAN CAPTURE... 5 2.4. EVOLVING SQL PLAN BASELINES... 6 2.5. STEP BY STEP EXAMPLE... 6 3. SQL PLAN BASELINE MANAGEMENT.... 14 3.1. BASELINE 속성값변경... 14 3.2. BASELINE MANAGEMENT... 16 3.3. TRANSFERING BASELINE... 17 3.4. BASELINE 삭제... 19-2 -

1. SQL Plan Management Overview 1.1. Introduction 데이터베이스를운영하면서성능저하의원인이라고하면쉽게아래와같은원인을꼽을수있다. - 비즈니스확장과사용량의증가로인한자원부족 - 잘못된데이터베이스및스토리지구성 - Heavy SQL 들로인한응답속도지원 - 데이터베이스버그 이중 SQL 의성능저하는데이터베이스성능저하의직접적인영향을주고있어, DBA 들은데이터베이 스를관리하며, 필요시마다 SQL 을튜닝하고, 옵티마이져가정확한예측을하도록통계정보를갱신하 는등의작업을하고있다. 특히 SQL 의실행계획은옵티마이져라는인공지능에의해계산되고만들어지는데, 불행히도그기능이 100% 퍼펙트하지않기때문에여러가지원인으로인해 SQL 의실행계획이변경되어혼란을초래하기도한다. 그원인은여러가지가있으나, 간단하게아래와같다. - 통계정보의갱신 - 옵티마이져파라미터의변경 - 스키마나테이블데이터의급격한변경 - 시스템환경과설정값변경 - 옵티마이져버전변경 이러한이유로오라클은예측하기어려운실행계획의변경을막기위해 Stored outlines 이나통계정보 수집을막거나, 특정테이블에대해통계정보갱신을잠금 (Lock) 하는기법들이도입되었다. 어쨌든오라클버전이올라가면서, 옵티마이져는진화하고발전하였고, 11g 에서는 9i 때도입된바인 드옅보기 (Bind Peeking) 기능의단점을커버하기위해어댑티브커서 (adaptive cursor) 와 SQL 의성능 을유지하기위해 SPM(SQL PLAN MANAGEMENT) 기능을제공한다. 특히 SPM 기능으로인해옵티마이져는자동으로변경되는 SQL 의실행계획을관리하고, 새로운실행 계획이만들어지더라고, 검증 (VERIFY) 이끝날때까지새로운실행계획을사용하지않으며, 현재의실행 계획보다성능이비슷하거나향상될경우에만사용할수있도록한다. 금번기술노트에서는 SPM 의기능과방법에대해예제를통해소개하고자한다. 1.2. SQL PLAN MANAGEMENT 주요구성요소 SPM 은 SQL 의성능 (Runtime-performance) 이실행계획의변경으로인해저하되는것을방지하기위해 개발된기능이다. - 3 -

SPM 은 SQL 의실행계획이변경되더라도바로적용시키지않고, 검증을확인된 (VERIFY) 실행계획만받아들이도록되어있다. SPM 의 3 가지주요구성요소는아래와같다. 아래의구성요소에대한예제는 2 장에서살펴보도록한다. q q q SQL PLAN BASELINE CAPTURE ð 현재 SPM에의해수락되어검증된실행계획에대한 SQL Baseline을생성하고, PLAN History 정보는 SYSAUX 테이블스페이스에저장됨 SQL PLAN BASELINE SELECTION ð PLAN History 에는수락된 (accepted) 된실행계획과수락되기전의 (unaccepted) 실행계획을모두포함함. ð 수락되기전의 (unaccepted) 실행계획은아직검증 (verified) 이되기전의실행계획이며, 거부된 (rejected) 실행계획은검증 (verified) 을통해적용할수없는실행계획을의미한다. SQL PLAN BASELINE EVOLUTION ð PLAN History안의검증이되지않은 (all unverified) 실행계획은이단계에서검증을통해수락 (accept) 되거나거부 (reject) 된다. 위의그림은 SPM 이 Statement log 안에반복되는 SQL 에대한 Plan History 를가지고있음을보여주고 있다. 2. SQL PLAN MANAGEMENT - 4 -

2.1. SPM 동작원리 SQL 이하드파싱되면, CBO(COSE BASED OPTIMIZER) 환경에서옵티마이져는여러개의실행계획을만들고, 그중가장 COST 가적은실행계획을선택한다. 만약 SQL 베이스라인 (BASELINE) 이존재하면, 옵티마이져는 flag-accepted 꼬리말을달고있는실행계획을찾으려고하고, 이미수락된, 즉 accepted flag 상태의실행계획이발견되면해당실행계획을사용한다. 만약 SQL 베이스라인에매칭되는실행계획을찾지못하면, 옵티마이져는 SQL 베이스라인의수락된실행계획들에대해평가작업을시작하여그중에 COST 가가장적은실행계획을사용한다. 옵티마이져에의해새로만들어진실행계획이 SQL 베이스라인의존재하는실행계획보다 COST 가작은경우에는, 일단 SQL 베이스라인에수락되기전상태 (unaccepted) 로저장되며, 검증 (verified) 되기전까지사용할수없다. 또한시스템업그레이드나마이그레이션과같은시스템상의변경이일어날경우, SQL 베이스라인의모든수락된 (accepted) 실행계획을새로검토하여가장 COST 가작은실행계획을받아들이고 Flagaccepted 한상태로변경한다. 2.2. Automatic Plan Capture OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES 파라미터는기본값이 FALSE, 이값을 TRUE 로변경하게되면, 시스템은자동으로모든 SQL 에대해 SQL 베이스라인을수집하며, 각각의 SQL 에대한 PLAN Hisotry 정보를저장한다. 가장최초로파싱되어사용되는실행계획은자동으로 flag-accepted 한상태로 SQL 베이스라인에저장된다. ( 자동으로실행계획을저장하는이기능은부하를줄수있으니, 적용전테스트할것을권고함.) SQL> SHOW PARAMETER OPTIMIZER_CAPTURE_SQL_PLAN_BASELI NES NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ optimizer_capture_sql_plan_baselines boolean FALSE SQL> ALTER SYSTEM SET OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES=TRUE; System altered. 2.3. Manual Plan Capture 이번단락에서는수동으로실행계획을저장하는방법을소개한다. 이작업은 DBMS_SPM 패키지를사용하며, 수동으로실행계획을 SQL 베이스라인에저장하는경우에는 DEFAULT 로 accepted 한상태로저장된다. SQL tuning set 을추가하는방법과 cursor 에저장된특정 SQL 의실행계획을추가하는방법 2 가지가있다. SQL 베이스라인이없다면베이스라인이새로생성되며, 베이스라인이존재하면실행계획은베이스라 - 5 -

인에추가된다. n LOAD_PLAN_FROM_SQLSET DECLARE l_plans_loaded PLS_INTEGER; BEGIN l_plans_loaded := DBMS_SPM.load_plans_from_sqlset( sqlset_name => 'my_sqlset'); END; / n LOAD_PLAN_FROM_CURSOR_CACHE DECLARE l_plans_loaded PLS_INTEGER; BEGIN l_plans_loaded := DBMS_SPM.load_plans_from_cursor_cache( sql_id => '1ghe87md0917n'); END; / 2.4. Evolving SQL PLAN Baselines 이단계는옵티마이져가 SQL 베이스라인에있는수락되지않은실행계획에대해수락 (accepted) 혹은거부 (rejected) 를결정한다. 자동수집환경에서는 EVOLVE_SQL_PLAN_BASELINE 함수에의해계산된며, 그결과를 CLOB 형태의보고서로보여준다 SET LONG 10000 SELECT DBMS_SPM.evolve_sql_plan_baseline(sql_handle => 'SYS_SQL_7b76323ad90440b9') FROM dual; 2.5. Step by Step Example 예제에서는수동수집을통해 SPM 을사용하는예를보여준다. 따라서 OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES 파라미터는 FALSE 로변경하고시작한다. CONN sys/oracle@test11g AS SYSDBA ALTER SYSTEM SET OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES=FALSE; 예제에서는수동수집을통해 SPM 을사용하는예를보여준다. 따라서 OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES 파라미터는 FALSE 로변경하고시작한다. - 6 -

--테스트를위한테이블생성및통계정보생성 SQL> CREATE TABLE spm_test ( 2 id NUMBER, 3 description VARCHAR2(50) 4 ); 테이블이생성되었습니다. SQL> DECLARE 2 TYPE t_tab IS TABLE OF spm_test%rowtype; 3 l_tab t_tab := t_tab(); 4 BEGIN 5 FOR i IN 1.. 10000 LOOP 6 l_tab.extend; 7 l_tab(l_tab.last).id := i; 8 l_tab(l_tab.last).description := 'Description for ' i; 9 END LOOP; 10 11 FORALL i IN l_tab.first.. l_tab.last 12 INSERT INTO spm_test VALUES l_tab(i); 13 14 COMMIT; 15 END; 16 / SQL> EXEC DBMS_STATS.gather_table_stats(USER, 'SPM_TEST', cascade=>true); --인덱스가없으므로 TABLE FULL SCAN 이이루어짐. SQL> SET AUTOTRACE TRACE SQL> SQL> SELECT description 2 FROM spm_test 3 WHERE id = 99; Execution Plan - 7 -

---------------------------------------------------------- Plan hash value: 278342638 ------------------------------------------------------------------------------ Id Operation Name Rows Bytes Cost (%CPU) Time ------------------------------------------------------------------------------ 0 SELECT STATEMENT 1 25 13 (0) 00:00:01 * 1 TABLE ACCESS FULL SPM_TEST 1 25 13 (0) 00:00:01 ------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("id"=99) Statistics -------------------------------------------- -------------- 0 recursive calls 0 db block gets 47 consistent gets 0 physical reads 0 redo size 454 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed --V$SQL 로부터 SQL_ID 값을찾아냄. SQL> SELECT sql_id 2 FROM v$sql 3 WHERE sql_text LIKE '%spm_test%' 4 AND sql_text NOT LIKE '%dba_sql_plan_baselines%' 5 AND sql_text NOT LIKE '%EXPLAIN%'; SQL_ID ------------- ffpxkrfmwu2nw - 8 -

--수동으로 SQL PLAN 베이스라인생성 SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 l_plans_loaded PLS_INTEGER; 3 BEGIN 4 l_plans_loaded := DBMS_SP M.load_plans_from_cursor_cache( 5 sql_id => 'ffpxkrfmwu2nw'); 6 7 DBMS_OUTPUT.put_line('Plans Loaded: ' l_plans_loaded); 8 END; 9 / Plans Loaded: 1 -- DBA_SQL_PLAN_BASELINES 뷰로부터베이스라인정보를조회함. --현재베이스라인에는하나의실행계획이있으며, ENABLED 와 ACCEPTED 칼럼값이 YES 임을확인가능하다. SQL> SELECT sql_handle, plan_name, enabled, accepted 2 FROM dba_sql_plan_baselines 3 WHERE sql_text LIKE '%spm_test%' 4 AND sql_text NOT LIKE '%dba_sql_plan_baselines%'; SQL_HANDLE PLAN_NAME ENA ACC ------------------------------ ------------------------------ --- --- SYS_SQL_7a5adea0a1422e62 SQL_PLAN_7nqqyn2hn4bm2f2fc655a YES YES -- 테스트를위해현재 SHARE POOL 을 FLUSH 함. SQL> ALTER SYSTEM FLUSH SHARED_POOL; 시스템이변경되었습니다. --테스트테이블에인덱스와통계정보를생성함. SQL> conn test/test@test11g 연결되었습니다. SQL> CREATE INDEX spm_test_idx ON spm_test(id); 인덱스가생성되었습니다. - 9 -

SQL> EXEC DBMS_STATS.gather_table_stats(USER, 'SPM_TEST', cascade=>true); --인덱스를만들고 SHARED POOL 을 FLUSH 하여 SQL 이하드파싱하도록했지만실행계획은여전히이전실행계획인테이블 FULL SCAN 을하고있음 SQL> SET AUTOTRACE TRACE SQL> SQL> SELECT description 2 FROM spm_test 3 WHERE id = 99; Execution Plan ----------------------------------------------- ----------- Plan hash value: 278342638 ------------------------------------------------------------------------------ Id Operation Name Rows Bytes Cost (%CPU) Time ---------------------------------------------------------- -------------------- 0 SELECT STATEMENT 1 25 13 (0) 00:00:01 * 1 TABLE ACCESS FULL SPM_TEST 1 25 13 (0) 00:00:01 ----------------------------------------------------------------------------- - Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("id"=99) Note ----- - SQL plan baseline "SQL_PLAN_7nqqyn2hn4bm2f2fc655a" used for this statement Statistics ---------------------------------------------------------- 7 recursive calls 0 db block gets - 10 -

47 consistent gets 0 physical reads 0 redo size 454 bytes sent via SQL*Net to client 415 bytes received via SQL *Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed -- DBA_SQL_PLAN_BASELINES 을보면하드파싱했음에도불구하고옵티마이져가이전실행계획을사용한이유를알수있다. 2 번째실행계획이 SQL 베이스라인에추가됨을확인할수있다. SQL 베이스라인에추가는되었으나 accepted 는 NO 상태임을알수있다. SQL> SELECT sql_handle, plan_name, enabled, accepted 2 FROM dba_sql_plan_baselines 3 WHERE sql_handle = 'SYS_SQL_7a5adea0a1422e62'; SQL_HANDLE PLAN_NAME ENA ACC ------------------------------ ------------------------------ --- --- SYS_SQL_7a5adea0a1422e62 SQL_PLAN_7nqqyn2hn4bm23034dc33 YES NO SYS_SQL_7a5adea0a1422e62 SQL_PLAN_7nqqyn2hn4bm2f2fc655a YES YES --EVOLVE_SQL_PLAN_BASELINE 함수를사용하여새로운실행계획에대한 EVOLVING 하고보고서를출력한다. --노란색으로표시한부분을살펴보면새로운실행계획이이전에비래수행시간도빠르고 IO 블록도적게읽는것을알수있다. SQL> SET LONG 10000 SQL> SELECT DBMS_SPM.evolve_sql_plan_baseline(sql_handle => 'SYS_SQL_7a5adea0a1422e62') 2 FROM dual; DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE(SQL_HANDLE=>'SYS_SQL_7A5ADEA0A1422E62') ------------------------------------------------------------------------------- Evolve SQL Plan Baseline Report ------------------------------------------------------------------------------- Inputs: - 11 -

------- SQL_HANDLE = SYS_SQL_7a5adea0a1422e62 PLAN_NAME = TIME_LIMIT = DBMS_SPM.AUTO_LIMIT VERIFY = YES DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE(S QL_HANDLE=>'SYS_SQL_7A5ADEA0A1422E62') COMMIT = YES Plan: SQL_PLAN_7nqqyn2hn4bm23034dc33 ------------------------------------ Plan was verified: Time used.172 second s. Plan passed performance criterion: 15.33 times better than baseline plan. Plan was changed to an accepted plan. Baseline Plan Test Plan Stats Ratio ------------- --------- ----------- Execution Status: COMPLETE COMPLETE DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE(SQL_HANDLE=>'SYS_SQL_7A5ADEA0A1422E62') Rows Processed: 1 1 Elapsed Time(ms):.174.012 14.5 CPU Time(ms): 0 0 Buffer Gets: 46 3 15.33 Physical Read Requests: 0 0 Physical Write Requests: 0 0 Physical Read Bytes: 0 0 Physical Write Bytes: 0 0 Executions: 1 1 ------------------------------------------------------------------------------- DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE(SQL_HANDLE=>'SYS_SQL_7A5ADEA0A1422E62') Report Summary ------------------------------------------------------------------------------- Number of plans verified: 1-12 -

Number of plans accepted: 1 --Evolving 후새로운실행계획이 accepted 되었음을확인한다. SQL> SELECT sql_handle, plan_name, en abled, accepted 2 FROM dba_sql_plan_baselines 3 WHERE sql_handle = 'SYS_SQL_7a5adea0a1422e62' ; SQL_HANDLE PLAN_NAME ENA ACC ------------------------------ ------------------------------ --- --- SYS_SQL_7a5adea0a1422e62 SQL_PLAN_7nqqyn2hn4bm23034dc33 YES YES SYS_SQL_7a5adea0a1422e62 SQL_PLAN_7nqqyn2hn4bm2f2fc655a YES YES --새로운실행계획이 SQL PLAN 베이스라인에서수락 (accepted) 된후옵티마이져는 COST 가적은새로운실행계획을사용한다. SQL> CONN test/test@test11g SQL> SET AUTOTRACE TRACE SQL> SQL> SELECT description 2 FROM spm_test 3 WHERE id = 99; Execution Plan ---------------------------------------------------------- Plan hash value: 3729106760 -------------------------------------------------------------------- ------------------------ Id Operation Name Rows Bytes Cost (%CPU) Time ------------ 0 SELECT STATEMENT 1 25 2 (0) 00:00:01 1 TABLE ACCESS BY INDEX ROWID SPM_TEST 1 25 2 (0) 00:00:01 * 2 INDEX RANGE SCAN SPM_TEST_IDX 1 1 (0) 00:00:01 ------------ Predicate Information (identified by operation id): --------------------------------------------------- - 13 -

2 - access("id"=99) Note ----- - SQL plan baseline "SQL_PLAN _7nqqyn2hn4bm23034dc33" used for this statement Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 4 consistent gets 0 physical reads 0 redo size 461 bytes sent via SQL*Net to client 416 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed 3. SQL Plan Baseline Management. 3.1. Baseline 속성값변경 ALTER_SQL_PLAN_BASELINE 함수를사용하여 SQL PLAN 베이스라인의설정된속성에대한값을변경할수있다. 설정할수있는속성값의종류는아래와같다. n Enabled (YES/NO): 옵티마이져에의해베이스라인의실행계획이 accepted 일경우사용할지안할지결정. Yes 일경우옵티마이져는 accepted 인경우새로운실행계획을사용할수있음. n fixed (YES/NO): 플랜을 fix 할것인지아닌지결정, yes 일경우새로운실행계획이들어와도 EVILVING 하지않음. n autopurge (YES/NO): YES 이면, 일정기간동안사용하지않은베이스라인은자동으로 purge 됨. n plan_name: SQL plan 이름을대체할경우사용, 최대문자 30 자리 n description: SQL Plan 설명을넣고싶을경우사용, 최대문자 30 자리. -- 위에테스트로사용한실행계획에대해 fixed 를 yes 로설정하는예제 SQL> SET SERVEROUTPUT ON - 14 -

SQL> DECLARE 2 l_plans_altered PLS_INTEGER; 3 BEGIN 4 l_plans_altered := DBMS_SPM.alter_sql_plan_baseline( 5 sql_handle => 'SYS_SQL_7a5adea0a1422e62', 6 plan_name => 'SQL_PLAN_7nqqyn2hn4bm23034dc33', 7 attribute_name => 'fixed', 8 attribute_value => 'YES'); 9 10 DBMS_OUTPUT.put_line('Plans Altered: ' l_plans_altered); 11 END; 12 / Plans Altered: 1 --위에서 fiexed 속성값을 yes 로변경한후아래와같이확인가능함. SQL> SET LONG 10000 SQL> SQL> SELECT * 2 FROM TABLE(DBMS_XPLAN.display_sql_plan_baseline(plan_name=>'SQL_PLAN_7nqqyn2hn4bm23034dc33')); PLAN_TABLE_OUTPUT SQL handle: SYS_SQL_7a5adea0a1422e62 SQL text: SELECT description FROM spm_test WHERE id = 99 Plan name: SQL_PLAN_7nqqyn2hn4bm23034dc33 Plan id: 808770611 Enabled: YES Fixed: YES Accepted: YES Origin: AUTO -CAPTURE ------------------------------------------------- ------------------------------- PLAN_TABLE_OUTPUT - 15 -

Plan hash value: 3729106760 Id Operation Name Rows Bytes Cost (% CPU) Time PLAN_TABLE_OUTPUT ---------------------------------------------------------------------- ---------- 0 SELECT STATEMENT 1 25 2 (0) 00:00:01 1 TABLE ACCESS BY INDEX ROWID SPM_TEST 1 25 2 (0) 00:00:01 * 2 INDEX RANGE SCAN SPM_TEST_TAB_ IDX 1 1 (0) 00:00:01 PLAN_TABLE_OUTPUT Predicate Information (iden tified by operation id): --------------------------------------------------- 2 - access("id"=99) 25 개의행이선택되었습니다. 3.2. Baseline Management SQL PLAN 베이스라인, SQL statement log, plan History, SQL Profile 정보들은모두기본적으로 SYSAUX 테이블스페이스에저장된다. 아래의두가지속성값을통해저장되는 space 와보존기간을조절할수있다. n space_budget_percent (default 10): SYSAUX 테이블스페이스에최대로저장될수있는최대값. % 로나타내며 1-50 까지설정가능하다. n plan_retention_weeks (default 53): 사용하지않는 (Unused) 실행계획에대한보존주기. - 16 -

5-523 주까지설정가능. -- DBA_SQL_MANAGEMENT_CONFIG 뷰를통해현재설정값을확인한다 SQL> SELECT parameter_name, parameter_value 2 FROM dba_sql_management_config; PARAMETER_NAME PARAMETER_VALUE ------------------------------ --------------- SPACE_BUDGET_PERCENT 10 PLAN_RETENTION_WEEKS 53 --DBMS_SPM.configure 를통해설정한다,. SQL> BEGIN 2 DBMS_SPM.configure('space_budget_percent', 11); 3 DBMS_SPM.configure('plan_retention_weeks', 54); 4 END; 5 / SQL> SQL> SELECT parameter_name, parameter _value 2 FROM dba_sql_management_config; PARAMETER_NAME PARAMETER_VALUE ------------------------------ --------------- SPACE_BUDGET_PERCENT 11 PLAN_RETENTION_WEEKS 54 3.3. Transfering Baseline DBMS_SPM 패키지는데이터베이스간에 BASELINE 을전송하는기능을제공한다. 아래는그절차를예제로보여준다. --먼저소스데이터베이스에 Staging 테이블을생성한다 SQL> BEGIN 2 DBMS_SPM.CREATE_STGTAB_BASELINE( 3 table_name => 'spm_stageing_tab', 4 table_owner => 'TEST', 5 tablespace_name => 'USERS'); 6 END; - 17 -

7 / -- PACK_STGTAB_BASELINE 기능을통해 SQL PLAN 베이스라인을 staging 테이블로 export 한다 SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 l_plans_packed PLS_INTEGER; 3 BEGIN 4 l_plans_packed := DBMS_SP M.pack_stgtab_baseline( 5 table_name => 'spm_stageing_tab', 6 table_owner => 'TEST'); 7 8 DBMS_OUTPUT.put_line('Plans Packed: ' l_plans_packed); 9 END; 10 / Plans Packed: 2 --위의작업이끝난후소스데이터베이스의 staging 을 datapump 를사용하여 export 한후 target 데이터베이스로 pump 를사용하여 import 한다. --import 가끝나면, UNPACK_STGTAB_BASELINE 기능을통해 SQL PLAN 베이스라인을특정사용 자로 import 한다. SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 l_plans_unpacked PLS_INTEGER; 3 BEGIN 4 l_plans_unpacked := DBMS_SPM.unpack_stgtab_baseline( 5 table_name => 'spm_stageing_tab', 6 table_owner => 'TEST', 7 creator => 'TEST'); 8 9 DBMS_OUTPUT.put_line('Plans Unpacked: ' l_plans_unpacked); 10 END; 11 / Plans Unpacked: 1-18 -

3.4. Baseline 삭제. DROP_SQL_PLAN_BASELINE 기능을통해베이스라인을삭제할수있다. SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 l_plans_dropped PLS_INTEGER; 3 BEGIN 4 l_plans_dropped := DBMS_SPM.drop_sql_plan_base line ( 5 sql_handle => 'SYS_SQL_7a5adea0a1422e62', 6 plan_name => NULL); 7 8 DBMS_OUTPUT.put_line(l_plans_dropped); 9 END; 10 / 2 SQL> SELECT sql_handle, plan_name, enabled, accepted 2 FROM dba_sql_plan_baselines 3 WHERE sql_handle = 'SYS_SQL_7a5adea0a1422e62'; 선택된레코드가없습니다. - 19 -