spa(sql performance analyze)를 이용한 통계 정보 수집...spa(sql performance analyze)는...

12
1122013 기술백서 White Paper SPA(SQL Performance Analyze)를 이용한 통계 정보 수집 ㈜엑셈 컨설팅본부/DB컨설팅팀 경렬 1. SPA란? SPA(SQL Performance Analyze)RAT(Real Application Testing)서비스의 옵션 중에 하나 이다. 문서는 SPA 이용해 좀더 안정적으로 통계정보를 생성하는 Process 대해 다룬다. 2. 통계 정보와 SQL Tuning 튜닝은 LEADING(A) USE_NL(B) INDEX(A A(COL1))처럼 간단한 힌트로 대부분 해결 가능하 . 이것이 가능한 이유는 Leading 같은 힌트로 쿼리의 조건이 무엇인지 지정해주면 나머 플랜은 Oracle Optimizer Query Transformation 최적화 알고리즘을 적용해 최적의 성능을 있도록 플랜을 작성하기 때문이다. 튜너 A 사이트에 튜닝 지원을 간다. 사이트에 도착한 A 가지고 있던 스크립트로 능숙하게 Tuning 대상을 발췌한다. 수집 기준은 Execution 1000 이상이면서 Buffer Gets 10000 Block 이상인 쿼리 무려 200 개의 쿼리가 추출되었다... A 군은 순간 당황했지만 빠르게 안정을 되찾고 입고 있던 와이셔츠의 소매 단추를 풀고 두번 접어올리고 나서는 차고 있던 시계를 풀어 책상 올려 놓는다. 시간은 9 30 분을 지나고 있다. ".. 오늘 개나 있을까...." A 군은 알듯 말듯한 미소를 지어 보이고는 중지 손가락으로 안경을 한번 치켜 올리고 이내 불꽃 튜닝에 들어간다

Upload: others

Post on 14-Sep-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: SPA(SQL Performance Analyze)를 이용한 통계 정보 수집...SPA(SQL Performance Analyze)는 RAT(Real Application Testing)서비스의 옵션 중에 하나 이다. 본 문서는

112│2013 기술백서 White Paper

SPA(SQL Performance Analyze)를 이용한 통계 정보

수집

㈜엑셈 컨설팅본부/DB컨설팅팀 오 경렬

1. SPA란?

SPA(SQL Performance Analyze)는 RAT(Real Application Testing)서비스의 옵션 중에 하나

이다. 본 문서는 SPA를 이용해 좀더 안정적으로 통계정보를 생성하는 Process에 대해 다룬다.

2. 통계 정보와 SQL Tuning

튜닝은 LEADING(A) USE_NL(B) INDEX(A A(COL1))처럼 간단한 힌트로 대부분 해결 가능하

다. 이것이 가능한 이유는 Leading과 같은 힌트로 쿼리의 키 조건이 무엇인지 지정해주면 나머

지 플랜은 Oracle Optimizer가 Query Transformation등 최적화 알고리즘을 적용해 최적의

성능을 낼 수 있도록 플랜을 작성하기 때문이다.

튜너 A가 사이트에 튜닝 지원을 간다.

사이트에 도착한 A는 가지고 있던 스크립트로 능숙하게 Tuning대상을 발췌한다.

수집 기준은 Execution이 1000 번 이상이면서 Buffer Gets이 10000 Block 이상인 쿼리

무려 200개의 쿼리가 추출되었다...

A군은 순간 당황했지만 빠르게 안정을 되찾고

입고 있던 와이셔츠의 소매 단추를 풀고 두번 접어올리고 나서는 차고 있던 시계를 풀어 책상 위

에 올려 놓는다.

시간은 9시 30분을 지나고 있다.

"흠.. 오늘 몇 개나 할 수 있을까...."

A군은 알듯 말듯한 미소를 지어 보이고는 중지 손가락으로 안경을 한번 치켜 올리고 이내 불꽃

튜닝에 들어간다

Page 2: SPA(SQL Performance Analyze)를 이용한 통계 정보 수집...SPA(SQL Performance Analyze)는 RAT(Real Application Testing)서비스의 옵션 중에 하나 이다. 본 문서는

Part 1 ORACLE │113

그리고.. 엑셀에 하나 둘 완료된 쿼리가 늘어날 때 마다... 희열을 느낀다....

이 글을 보는 당신은 어떻게 할 것인가?

A군의 판단이 잘못된 것인가?

잘못된 판단이 아니다 최선의 판단이다..... 11g 전 까지는....

11g New Feature인 Pending Statistics를 SPA와 함께 사용한다면

A군의 200개의 튜닝 대상 쿼리는 10개 내외로 줄어 들 수도 있다.

오라클 Optimizer는 생각보다 똑똑하다.

3. SPA 사용 가능 여부 확인

RAT Option이 FALSE면 사용할 수 없다.

SELECT * FROM V$OPTION

WHERE PARAMETER = 'Real Application Testing'

PARAMETER VALUE

-------------------------------------- --------

Real Application Testing TRUE

4. 사용 예

간단한 사례를 다룬다. 본인의 것으로 흡수하고 수정해서 실무에 적용하길 바란다.

시나리오 요약

0. 테스트 스키마 생성 및 쿼리 수행

1. SQL_SET 생성

2. ANALYSIS_TASK #1 생성

3. SCHEMA or TABLE Pending Statistcs 설정

4. 통계 정보 수집

5. Session Use Pending Statistics 설정

Page 3: SPA(SQL Performance Analyze)를 이용한 통계 정보 수집...SPA(SQL Performance Analyze)는 RAT(Real Application Testing)서비스의 옵션 중에 하나 이다. 본 문서는

114│2013 기술백서 White Paper

6. ANALYSIS_TASK #2 생성

7. ANALYSIS_TASK #1, #2 비교

8. 리포팅

9. 비교 결과 조회 스크립트

0. 테스트 스키마 생성 및 쿼리 수행

DROP TABLE EXEM_T1 PURGE;

CREATE TABLE EXEM_T1

AS

SELECT LEVEL C1, 'A' C2

FROM DUAL

CONNECT BY LEVEL <= 100000;

INSERT INTO EXEM_T1 VALUES(1, 'B');

CREATE INDEX I1_EXEM_T1 ON EXEM_T1(C2) TABLESPACE TSD_QM;

EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME =>'MAXGAUGE'

, TABNAME =>'EXEM_T1'

, NO_INVALIDATE =>FALSE

, METHOD_OPT =>'FOR ALL COLUMNS SIZE 3'

, ESTIMATE_PERCENT =>10);

-- SQL 수행 (A, B 두 가지가 있고 분포가 좋지 않음 -> FTS)

SELECT COUNT(C1)

FROM EXEM_T1

WHERE C2 = :B1;

--COUNT(C1)

--100000

1. SQL_SET 생성

SELECT ID,

Page 4: SPA(SQL Performance Analyze)를 이용한 통계 정보 수집...SPA(SQL Performance Analyze)는 RAT(Real Application Testing)서비스의 옵션 중에 하나 이다. 본 문서는

Part 1 ORACLE │115

NAME,

OWNER,

DESCRIPTION,

CREATED,

LAST_MODIFIED,

STATEMENT_COUNT

FROM DBA_SQLSET

where name = 'OKR_TEST';

--ID NAME OWNER DESCRIPTION CREATED LAST_MODIFIED STATEMENT_COUNT

--24 OKR_TEST MAXGAUGE 2013-06-27 오후 1:37:31 2013-06-27 오후

1:37:43 4

-- SQLSET 과 ANALYSIS_TASK 연결 고리 확인

SELECT DESCRIPTION

FROM DBA_SQLSET_REFERENCES

WHERE SQLSET_NAME = 'OKR_TEST';

--DESCRIPTION

--created by: SQL Performance Analyzer - task: OKR_SPA

SELECT TASK_NAME,

EXECUTION_NAME,

EXECUTION_TYPE,

STATUS,

EXECUTION_END

FROM USER_ADVISOR_EXECUTIONS

WHERE TASK_NAME = 'OKR_SPA';

--TASK_NAME EXECUTION_NAME EXECUTION_TYPE STATUS EXECUTION_END

--OKR_SPA OKR_AFTER TEST EXECUTE COMPLETED 2013-06-27 오후 1:48:07

--OKR_SPA OKR_BEFORE TEST EXECUTE COMPLETED 2013-06-27 오후 1:42:52

--OKR_SPA OKR_COMP COMPARE PERFORMANCE COMPLETED 2013-06-27 오후 1:48:34

-- TASK 가 존재할 경우 SET 삭제 전에 TASK 먼저 삭제해야 그 다음 SET 삭제가 가능하다.

-- ANALYSIS_TASK DROP

EXEC DBMS_SQLPA.DROP_ANALYSIS_TASK('OKR_SPA');

-- TUNING SET DROP

EXEC DBMS_SQLTUNE.DROP_SQLSET('OKR_TEST');

Page 5: SPA(SQL Performance Analyze)를 이용한 통계 정보 수집...SPA(SQL Performance Analyze)는 RAT(Real Application Testing)서비스의 옵션 중에 하나 이다. 본 문서는

116│2013 기술백서 White Paper

2. ANALYSIS_TASK #1 생성

ANALYSIS_TASK는 4가지 방법으로 생성 가능하다.

(1) Sql text format

EXEC :stmt_task := DBMS_SQLPA.CREATE_ANALYSIS_TASK(

sql_text => 'select quantity_sold from sales s, times t where s.time_id = t.time_id

and s.time_id = TO_DATE(''24-NOV-00'')');

(2) Sql id format (cursor cache)

EXEC :stmt_task := DBMS_SQLPA.CREATE_ANALYSIS_TASK(sql_id => 'ay1m3ssvtrh24');

(3) Workload repository format

exec :stmt_task := DBMS_SQLPA.CREATE_ANALYSIS_TASK(

begin_snap => 1,

end_snap => 2,

sql_id => 'ay1m3ssvtrh24');

(4) Sql tuning set format (first we need to load an STS, then analyze it)

EXEC :sts_task := DBMS_SQLPA.CREATE_ANALYSIS_TASK( --- sqlset_name => 'my_workload',

--- order_by => 'BUFFER_GETS', --- description => 'process workload ordered by

buffer gets');

--아래는 Sql tuning set format 사용한 예제이다.

--SQLSET 생성

EXEC DBMS_SQLTUNE.CREATE_SQLSET('OKR_TEST');

--내용을 채워넣는다

--COMMAND TYPE

--2 --> insert

--3 --> select (for update)

--6 --> update

Page 6: SPA(SQL Performance Analyze)를 이용한 통계 정보 수집...SPA(SQL Performance Analyze)는 RAT(Real Application Testing)서비스의 옵션 중에 하나 이다. 본 문서는

Part 1 ORACLE │117

--7 --> delete

--189 --> merge

DECLARE

cur DBMS_SQLTUNE.SQLSET_CURSOR;

BEGIN

OPEN cur FOR

SELECT VALUE(P)

FROM table(

DBMS_SQLTUNE.SELECT_CURSOR_CACHE(

'parsing_schema_name in (''MAXGAUGE'')

and upper(sql_text) like ''%EXEM_T1%''

AND command_type IN (2,3,6,7,189)',

NULL, NULL, NULL, NULL, 1, NULL,

'ALL')) P;

DBMS_SQLTUNE.LOAD_SQLSET(sqlset_name => 'OKR_TEST'

,populate_cursor => cur);

END;

----update and delete SQL statements from an STS based on a search condition

--BEGIN

-- DBMS_SQLTUNE.DELETE_SQLSET(

-- sqlset_name => 'my_sql_tuning_set',

-- basic_filter => 'executions < 50');

--END;

--/

--

-- Task 생성 확인

select count(1) from DBA_SQLSET_STATEMENTS where sqlset_name = 'OKR_TEST'

--count(1)

--4

-- 생성

DECLARE

TNAME VARCHAR2(30);

BEGIN

TNAME := DBMS_SQLPA.CREATE_ANALYSIS_TASK( SQLSET_NAME => 'OKR_TEST'

, BASIC_FILTER => NULL

, ORDER_BY => 'EXECUTIONS'

, TOP_SQL => 100

Page 7: SPA(SQL Performance Analyze)를 이용한 통계 정보 수집...SPA(SQL Performance Analyze)는 RAT(Real Application Testing)서비스의 옵션 중에 하나 이다. 본 문서는

118│2013 기술백서 White Paper

, TASK_NAME => 'OKR_SPA'

, DESCRIPTION => NULL

, SQLSET_OWNER => NULL

);

END;

-- EXECUTE_ANALYSIS_TASK

-- 가장 빠른 방법은 execution_type => 'CONVERT SQLSET'

-- ANALYSIS_TASK 생성

begin

DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(

task_name => 'OKR_SPA',

execution_type => 'EXECUTE',

execution_name => 'OKR_BEFORE');

end;

-- 생성 결과 조회

select execution_name

,status

,execution_end

,execution_end

from USER_ADVISOR_EXECUTIONS

where task_name = 'OKR_SPA';

--EXECUTION_NAME STATUS EXECUTION_END

--OKR_BEFORE COMPLETED 2013-07-02 오후 3:04:03

3. SCHEMA or TABLE Pending Statistcs 설정

-- 조회 결과가 TRUE 이면 Pending 이 걸려있지 않은 상태다

SELECT DBMS_STATS.GET_PREFS('PUBLISH', 'maxgauge', 'EXeM_T1') PUBLISH FROM DUAL;

--PUBLISH

--TRUE

-- FALSE 로 변경 -> 운영간에 통계정보 생성에 의한 플랜 변경을 막기위한 조치

Exec dbms_stats.set_schema_prefs('maxgauge', pname => 'PUBLISH', pvalue => 'FALSE');

Page 8: SPA(SQL Performance Analyze)를 이용한 통계 정보 수집...SPA(SQL Performance Analyze)는 RAT(Real Application Testing)서비스의 옵션 중에 하나 이다. 본 문서는

Part 1 ORACLE │119

4. 통계정보 수집

-- 거의 대부분의 데이터를 지우고 Histogram 도 생성하기 때문에 인덱스를 이용함

delete exem_t1

where c2 = 'A'

-- 통계정보 재생성

exec dbms_stats.gather_table_stats(ownname =>'MAXGAUGE'

, tabname =>'EXEM_T1'

, no_invalidate =>FALSE

, method_opt =>'for all columns size 3'

, estimate_percent=>10);

-- Pending 통계 조회

SELECT * FROM DBA_TAB_PENDING_STATS

WHERE TABLE_NAME = 'EXEM_T1'

-- 하지만 통계를 Pending 했으므로 여전히 FTS 플랜

select count(c1)

from exem_t1

where c2 = :b1;

--Pending 상태에서 수집한 최신 통계정보를 이용해서 SPA 수행

5. Session Use Pending Statistics 설정

alter session set optimizer_use_pending_statistics = TRUE;

-- 하지만 통계를 Pending 했으므로 여전히 FTS 플랜

select count(c1)

from exem_t1

where c2 = :b1;

6. ANALYSIS_TASK #2 생성

-- OKR_AFTER 이름으로 TASK 를 만든다.

begin

DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(

Page 9: SPA(SQL Performance Analyze)를 이용한 통계 정보 수집...SPA(SQL Performance Analyze)는 RAT(Real Application Testing)서비스의 옵션 중에 하나 이다. 본 문서는

120│2013 기술백서 White Paper

task_name => 'OKR_SPA',

execution_type => 'EXECUTE',

execution_name => 'OKR_AFTER');

새 섹션 2 페이지 5

execution_name => 'OKR_AFTER');

end;

7. ANALYSIS_TASK #1, #2 비교

begin

DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(

task_name => 'OKR_SPA',

execution_type => 'COMPARE PERFORMANCE',

execution_name => 'OKR_COMP',

execution_params => dbms_advisor.arglist(

'execution_name1',

'OKR_BEFORE',

'execution_name2',

'OKR_AFTER'

)

);

end;

8. 리포팅

set long 100000 longchunksize 100000 linesize 200 head off feedback off echo off

spool report.html

SELECT dbms_sqlpa.report_analysis_task('OKR_SPA', 'HTML', 'ALL','ALL') FROM dual;

spool off

--Click here to see the file report.html in html formart

;

Page 10: SPA(SQL Performance Analyze)를 이용한 통계 정보 수집...SPA(SQL Performance Analyze)는 RAT(Real Application Testing)서비스의 옵션 중에 하나 이다. 본 문서는

Part 1 ORACLE │121

9. 비교 결과 조회 스크립트

with TMP as

(

select /*+ materialize */

Page 11: SPA(SQL Performance Analyze)를 이용한 통계 정보 수집...SPA(SQL Performance Analyze)는 RAT(Real Application Testing)서비스의 옵션 중에 하나 이다. 본 문서는

122│2013 기술백서 White Paper

b.sql_id

,b.plan_hash_value b_ph

,a.plan_hash_value a_ph

,case when (b.buffer_gets-a.buffer_gets) >= 0

then '개선'

when (b.buffer_gets-a.buffer_gets) < 0

then '저하'

end "성능"

,b.optimizer_cost b_cost

,a.optimizer_cost a_cost

,b.executions b_exec

,a.executions a_exec

,b.rows_processed b_rows

,a.rows_processed a_rows

,b.elapsed_time B_ET

,a.elapsed_time A_ET

,b.buffer_gets B_BG

,a.buffer_gets A_BG

,b.disk_reads b_dr

,a.disk_reads a_dr

,round(100-

(decode(a.buffer_gets,0,1,a.buffer_gets)/decode(b.buffer_gets,0,1,b.buffer_gets))*100,

1) bg_rate

,round(100-

(decode(a.elapsed_time,0,1,a.elapsed_time)/decode(b.elapsed_time,0,1,b.elapsed_time))*

100,1) et_rate

from dba_advisor_sqlstats b

,dba_advisor_sqlstats a

where 1=1

and b.execution_name = :before

and a.execution_name = :after

and a.sql_id = b.sql_id

and a.plan_hash_value <> b.plan_hash_value

)

select /*+ leading(a) use_nl(r) */

hash_value hv

,a.*

,parsing_schema_name pars_nm

,sql_profile Pf

,module

,executions R_EXEC

Page 12: SPA(SQL Performance Analyze)를 이용한 통계 정보 수집...SPA(SQL Performance Analyze)는 RAT(Real Application Testing)서비스의 옵션 중에 하나 이다. 본 문서는

Part 1 ORACLE │123

,round(BUFFER_GETS/decode(executions,0,1,executions),0) R_BG

,round(DISK_READS/decode(executions,0,1,executions),1) R_DR

,round(ROWS_PROCESSED/decode(executions,0,1,executions),0) R_ROWS

,round(ELAPSED_TIME/decode(executions,0,1,executions)/1000000,1) R_ET

,round(CPU_TIME/decode(executions,0,1,executions)/1000000,1) R_CT

,last_active_time last_t

,first_load_time first_t

,sql_fulltext text

from tmp a

,v$sqlarea r

where a.sql_id = r.sql_id

5. 마치며

본 문서의 내용은 프로그램으로 치면 "Hello World" 이다. 꼭 내용을 숙지하고 스크립트나 엑셀

메크로 등으로 자동화하여 업무에 적용하길 바란다. 이론은 절대 경험을 이기지 못한다.