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

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

歯sql_tuning2

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

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

목 차

The Self-Managing Database : Automatic Health Monitoring and Alerting

데이터베이스-4부0816

untitled

Oracle Database 10g: Self-Managing Database DB TSC

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

제목을 입력하세요.

PowerPoint 프레젠테이션

DBMS & SQL Server Installation Database Laboratory

ALTIBASE HDB Patch Notes

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

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

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

슬라이드 1

MS-SQL SERVER 대비 기능

결과보고서

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

untitled

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

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

13주-14주proc.PDF

PowerPoint Presentation

*2009데이터_3부

Jerry Held

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

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

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

Slide 1

SQL Tuning Business Development DB

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

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

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

Jerry Held


리뉴얼 xtremI 최종 softcopy

세미나(장애와복구-수강생용).ppt

2002 Game White paper 2002 Game White paper

Intra_DW_Ch4.PDF

소만사 소개

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

<BED5BACEBCD32E696E6464>

62

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

PRO1_09E [읽기 전용]

Web Application Hosting in the AWS Cloud Contents 개요 가용성과 확장성이 높은 웹 호스팅은 복잡하고 비용이 많이 드는 사업이 될 수 있습니다. 전통적인 웹 확장 아키텍처는 높은 수준의 안정성을 보장하기 위해 복잡한 솔루션으로 구현

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

ePapyrus PDF Document

Microsoft Word - 05_SUBPROGRAM.doc

PowerPoint 프레젠테이션

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

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

歯PLSQL10.PDF

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

thesis-shk

원장 차세대 필요성 검토

6주차.key

Oracle hacking 작성자 : 임동현 작성일 2008 년 10 월 11 일 ~ 2008 년 10 월 19 일 신규작성 작성내용

Simplify your Job Automatic Storage Management DB TSC

빅데이터시대 Self-BI 전략 이혁재이사 비아이씨엔에스

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

제목 레이아웃

Cache_cny.ppt [읽기 전용]

Microsoft PowerPoint - Oracle Data Access Pattern.ppt

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

Oracle Wait Interface Seminar

USER GUIDE

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

arcplan Enterprise 6 Charting Facelifts

용어사전 PDF

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

음악부속물

음악부속물

음악부속물

PowerPoint Presentation

ALTIBASE HDB Patch Notes

*캐릭부속물

PCServerMgmt7

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

제20회_해킹방지워크샵_(이재석)

1217 WebTrafMon II

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

PRO1_02E [읽기 전용]

PART

Part Part

£01¦4Àå-2

½ºÅ丮ÅÚ¸µ3_³»Áö

272*406OSAKAÃÖÁ¾-¼öÁ¤b64ٽÚ

MySQL-.. 1

<30362E20C6EDC1FD2DB0EDBFB5B4EBB4D420BCF6C1A42E687770>

만화부속물

만화부속물

Microsoft PowerPoint - 10Àå.ppt

오라클 데이터베이스 10g 핵심 요약 노트

PowerPoint Template

NoSQL

Transcription:

Result Cache 동작원리및활용방안 엑셈컨설팅본부 /DB 컨설팅팀김철환 개요 ORACLE DBMS 를사용하는시스템에서 QUERY 성능은무엇보다중요한요소중하나이며그 성능과직접적인관련이있는것이 I/O 이다. 많은건수를 ACCESS 해야만원하는결과값을얻을수있는 QUERY 을실행하게된다면 BLOCK I/O 가많이발생하게된다. 이런이유로 QUERY 의성능은좋지못할것이다. 코드테이블과같이적은데이터를동시에많은사용자들이조회한다면 BUFFER CACHE 에서원하는 BLOCK 을찾아결과를전송하겠지만동시에많은사용자들이사용하기때문에 HOT BLOCK 이되고 ORACLE 대기이벤트가발생하여빠른성능을기대하기가어렵다. I/O 에따라 QUERY 의성능이좌우되기때문에 I/O 을최소한으로발생시키고 QUERY 를실 행한다면성능은향상될것이다. ORACLE 11G 에서 I/O 의개선을위해선보인기능이 RESULT CACHE 기능이다. RESULT CACHE 는 SHARED POOL 에 RESULT CACHE MEMORY 로불리는영역에 SQL 및 PL/SQL FUNCTION 의결과를저장하고, 이후동일 QUERY 조회시 RESULT CACHE 에저장되어있는 QUERY 결과값을그대로활용하는기능이다. 반복적으로동일한결과값을조회하는 QUERY 에서사용되며많은데이터를처리하여적은결과건수를보고자할때 BLOCK I/O 을발생시키지않고결과를전송하기때문에조회성능에있어서매우빠르다. 이제부터 RESULT CACHE QUERY 의동작원리와설정방법을알아본후에기능활용에대해 알아보도록하자. 24 2013 기술백서 White Paper

RESULT CACHE QUERY 동작원리 일반적으로 QUERY 가수행되어 BUFFER CACHE 에원하는블록이존재한다면요청한세션에게블록을전송한다. 만약 BUFFER CACHE 영역에존재하지않는다면 DISK I/O 발생후 BUFFER CACHE 에 BLOCK 을올려놓고요청한세션에게결과값을전송한다. RESULT CACHE 기능은일반적인 QUERY 동작방식과같지만그결과값을 CACHING 한다는 점이다르다. RESULT CACHE QUERY 최초실행. 1. RESULT CACHE QUERY 가실행되면가장먼저 SHARED POOL 영역의 RESULT CACHE 메모리에서 OBJECT 의 CACHING 여부를확인한다. 2. OBJECT 가 CACHING 되어있지않다면 BUFFER CACHE 에서 BLOCK 을찾는다. 3. BUFFER CACHE 에원하는 BLOCK 이존재하지않으면 DISK 에서 BLOCK 을읽어 BUFFER CACHE 에전송한다. 4. 그결과값을 QUERY 한세션에전송한다. 5. 마지막으로 RESULT CACHE 영역에 QUERY 결과값을저장한다. Part 1 ORACLE 25

RESULT CACHE QUERY 반복실행. 1. RESULT CACHE QUERY 가실행되면가장먼저 SHARED POOL 영역의 RESULT CACHE 메모리에서 OBJECT 의 CACHING 여부를확인한다. 2. CACHING 된정보가존재하면 I/O 을발생시키지않고 CACHING 된결과값을요청한세션에게전송한다. RESULT CACHE 기능설정및해지 RESULT CACHE 기능설정하기 PARAMETER 설정으로 RESULT CACHE 기능을사용할수있다. 설정에필요한주요 PARAMETER 들을살펴보도록하겠다. RESULT_CACHE_MODE RESULT_CACHE_MODE PARAMETER 값에따라 2 가지 MODE 의설정이가능한데 MANUAL 과 FORCE 이다. MANUAL 일경우에는 SQL 마다 /*+ RESULT_CACHE */ HINT 을주어 26 2013 기술백서 White Paper

RESULT CACHE 기능을사용할수있고 FORCE 일경우에는모든 SQL 이 RESULT CACHE 의 대상이된다. 단 /*+ NO_ RESULT_CACHE */ HINT 을제외된다. RESULT_CACHE_MODE PARAMETER 의 DEFAULT 값은 MANUAL 이다. RESULT_CACHE_MAX_SIZE RESULT CACHE 기능을사용하려면 RESULT_CACHE_MAX_SIZE 값도명시적으로지정되어있어야한다. 이 PARAMETER 의최대값은 SHARED POOL 의최대 75% 까지만설정할수있다. RESULT_CACHE_MAX_RESULT 하나의 SQL 에결과집합에대한전체캐시영역에서최대할당할수있는메모리크기이며 DEFAULT 값은 5% 이다. RESULT_CACHE_REMOTE_EXPIRATION REMOTE DATABASE OBJECT 의보관주기를시간 ( 분 ) 지정이가능하며 DEFAULT 값은 0 이 다. The default is 0 which means that resultsets dependant on remote OBJECT RESULT CACHE 기능해지하기 RESULT CACHE 기능을해지하는방법에는특정 INSTANCE 가 RESULT CACHE 기능을사용할수없게설정하는방법과 RESULT CACHE 기능은사용이가능하지만 CACHE 에서 OBJECT 을해지하는 2 가지방법이있다. INSTANCE 가 RESULT CACHE 기능을사용하지않으려면 RESULT_CACHE_MODE 값을 0 의값으로설정하고, INSTANCE 을재기동하면된다. RESULT CACHE 기능은사용가능하지만 CACHING 되어있는 OBJECT 을해지하는방법은 RESULT CACHE 패키지를이용해해지할수있다. CACHE 에서해지하는방법은예제를통해알아보도록하겠다. Part 1 ORACLE 27

CACHING 된 OBJECT 해지하는방법 RESULT CACHE 기능을사용하다가 CACHING 된여러 OBJECT 중에서특정 OBJECT 만 CACHE 에서해지하려면 DBMS_RESULT_CACHE.INVALIDATE 패키지를사용하여해지할수있다. ID, TYPE, STATUS, BUCKET_NO, HASH,NAME FROM V$RESULT_CACHE_OBJECT; [ 결과값 ] ID TYPE STATUS BUCKET_NO HASH NAME ----- ---- ------- ---------- --------- ---------------------------- 0 Dependency Published 660 319061 DBAADM.TB_RC_TEST_YYYYMMDD 1 RESULT Published 2011 159411 /*+ RESULT_CACHE */ SUBSTR(SDATE,1,6) SDATE, PROD, SUM(AMT1) AMT1, SUM(amt2) AMT2, SUM(AMT3) AMT3 FROM TB_RC_TEST_YYYYMMDD PROD [ 패키지실행 ] EXEC DBMS_RESULT_CACHE.INVALIDATE('DBAADM',' TB_RC_TEST_YYYYMMDD') ID, TYPE, STATUS, BUCKET_NO, HASH,NAME FROM V$RESULT_CACHE_OBJECT; [ 결과값 ] 28 2013 기술백서 White Paper

no rows selected. [ 패키지실행 ] EXEC DBMS_RESULT_CACHE.FLUSH ID, TYPE, STATUS, BUCKET_NO, HASH,NAME FROM V$RESULT_CACHE_OBJECT; [ 결과값 ] no rows selected. RESULT CACHE 에등록된모든 OBJECT 들을 DBMS_RESULT_CACHE.FLUSH 패키지를통해일괄해지할수있다. /*+ RESULT_CACHE */ 1 FROM DUAL; /*+ RESULT_CACHE */ 2 FROM DUAL; /*+ RESULT_CACHE */ 3 FROM DUAL; ID, TYPE, STATUS, BUCKET_NO, HASH,NAME FROM V$RESULT_CACHE_OBJECT; [ 결과값 ] ID TYPE STATUS BUCKET_NO HASH NAME -- ---------- --------- -------- -------- ------------------------------------- 2 RESULT Published 3870 83370270 /*+ RESULT_CACHE */ 3 FROM DUAL 1 RESULT Published 2222 93590190 /*+ RESULT_CACHE */ 2 FROM DUAL 0 RESULT Published 3414 7988310 /*+ RESULT_CACHE */ 1 FROM DUAL Part 1 ORACLE 29

[ 패키지실행 ] EXEC DBMS_RESULT_CACHE.FLUSH ID, TYPE, STATUS, BUCKET_NO, HASH,NAME FROM V$RESULT_CACHE_OBJECT; [ 결과값 ] no rows selected RESULT CACHE 기능활용하기 과거고객사의예를들어보면온라인시간에상품들에대해실적을보는업무가있었다. 실적테이블은 1 년동안보관되며 NON PARTITION 된테이블이 12 개존재하고있다. 특정월에해당하는실적을보려면해당테이블에모든데이터를읽어야만한다. 그렇게되면 I/O 가많이발생해빠른성능을기대하기어렵다. 그래서매일야간배치가실행되어전일기준으로실적집계테이블을갱신하고있었다. 많은개선의효과가있지만여전히읽어야할데이터가많기때문에많은블록 I/O 가발생하고있었다. 여기서각달에해당하는실적조회를 RESULT CACHE 기능을사용한다면많은성능개선이있을것이다. 특정월에해당하는실적테스트데이터를생성하여 RESULT CACHE 기능을활용해보도록하자. 테이블생성스크립트 [DDL 실행 ] CREATE TABLE TB_RC_TEST_YYYYMMDD AS TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYYMM') TRIM(TO_CHAR(ROUND(DBMS_RANDOM.VALUE(1,31)),'09')) 30 2013 기술백서 White Paper

TRIM(TO_CHAR(ROUND(DBMS_RANDOM.VALUE(0,23)),'09')) TRIM(TO_CHAR(ROUND(DBMS_RANDOM.VALUE(00,59)),'09')) SDATE, DBMS_RANDOM.STRING('U',2) PROD, ROUND(DBMS_RANDOM.VALUE(100,100000)) AMT1, ROUND(DBMS_RANDOM.VALUE(10,10000)) AMT2, ROUND(DBMS_RANDOM.VALUE(1000,100)) AMT3 FROM DUAL CONNECT BY LEVEL <= 10000000 ; RESULT CACHE 기능을사용하지않은경우 (X) SUBSTR(SDATE,1,6) SDATE, PROD, SUM(AMT1) AMT1, SUM(AMT2) AMT2, SUM(AMT3) AMT3 FROM TB_RC_TEST_YYYYMMDD PROD [ 실행계획 ] call count cpu elapsed disk QUERY current rows Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 47 15.62 15.80 46944 46948 0 676 total 49 15.62 15.80 46944 46948 0 676 Rows (1st) Row Source OPERATION ---------- --------------------------------------------------- 676 SORT GROUP BY (cr=46948 pr=46944 pw=0 time=15803245) 10000000 TABLE ACCESS FULL TB_RC_TEST_YYYYMMDD (cr=46948 pr=46944 pw=0 time=3144528) 실행결과를보면 38,670 개의 BLOCK I/O 가발생하였다. RESULT CACHE 기능을이용하여테스트를다시수행해보자. Part 1 ORACLE 31

RESULT CACHE 기능을사용한경우 (O) ( 최초실행 ) /*+ RESULT_CACHE */ SUBSTR(SDATE,1,6) SDATE, PROD, SUM(AMT1) AMT1, SUM(AMT2) AMT2, SUM(AMT3) AMT3 FROM TB_RC_TEST_YYYYMMDD PROD [ 실행계획 ] call count cpu elapsed disk QUERY current rows Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 47 15.62 15.80 46944 46948 0 676 total 49 15.62 15.80 46944 46948 0 676 Rows (1st) Row Source OPERATION ---------- --------------------------------------------------- 676 SORT GROUP BY (cr=46948 pr=46944 pw=0 time=15803245) 10000000 TABLE ACCESS FULL TB_RC_TEST_YYYYMMDD (cr=46948 pr=46944 pw=0 time=3144528) 수행한결과여전히 38,670 개의 BLOCK I/O 가발생하고있다. 최초 QUERY 실행시 CACHING 된영역에 OBJECT 가존재하지않았기때문이다. 이제 VIEW 를보면 CACHE 영역 에등록되어있는것을볼수있다. CACHING 된 OBJECT 보기 ID, TYPE, STATUS, BUCKET_NO, HASH, 32 2013 기술백서 White Paper

FROM NAME V$RESULT_CACHE_OBJECT; [ 결과값 ] ID TYPE STATUS BUCKET_NO HASH NAME ---- --------------- -------- --------- ---------- --------- ------------------- 0 Dependency Published 660 319061 DBAADM.TB_RC_TEST_YYYYMMDD 1 RESULT Published 2011 159411 /*+ RESULT_CACHE */ 이제 CACHE 등록이되어있는것을확인했으니다시한번수행해보자. RESULT CACHE 기능을사용한경우 (O) ( 반복실행 )) /*+ RESULT_CACHE */ SUBSTR(SDATE,1,6) SDATE, PROD, SUM(AMT1) AMT1, SUM(AMT2) AMT2, SUM(AMT3) AMT3 FROM TB_RC_TEST_YYYYMMDD PROD [ 실행계획 ] call count cpu elapsed disk QUERY current rows Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 47 0.00 0.00 0 0 0 676 total 49 0.00 0.00 0 0 0 676 Rows (1st) Row Source OPERATION ---------- --------------------------------------------------- 676 RESULT CACHE gnxqgpxppdavj80b6rddg4qsqj (cr=0 pr=0 pw=0 time=20 us) 0 SORT GROUP BY (cr=0 pr=0 pw=0 time=0 ) 0 TABLE ACCESS FULL TB_RC_TEST_YYYYMMDD (cr=0 pr=0 pw=0 time=0 ) Part 1 ORACLE 33

실행계획을보면 I/O 가전혀발생하지않았다. I/O 가전혀발생되지않아 SQL 을반복수행하더라도성능을향상시켜준다. 여기서 RESULT CACHE 라는 OPERATION 을볼수있다. 결과값이 CACHING 된것이다. INLINE VIEW 나 WITH 문과같은쿼리에서도 RESULT CACHE 기능을사용할수있다. 독립적으로 QUERY 블록에 CACHING 이가능하기때문이다. 테스트를통해알아보도록하자. 테이블생성스크립트 [DDL 실행 ] CREATE TABLE TB_RC_TEST_SYSDATE AS TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYYMM') TRIM(TO_CHAR(ROUND(DBMS_RANDOM.VALUE(1,31)),'09')) TRIM(TO_CHAR(ROUND(DBMS_RANDOM.VALUE(0,23)),'09')) TRIM(TO_CHAR(ROUND(DBMS_RANDOM.VALUE(00,59)),'09')) SDATE, DBMS_RANDOM.STRING('U',2) PROD, ROUND(DBMS_RANDOM.VALUE(100,100000)) AMT1, ROUND(DBMS_RANDOM.VALUE(10,10000)) AMT2, ROUND(DBMS_RANDOM.VALUE(1000,100)) AMT3 FROM DUAL CONNECT BY LEVEL <= 300000 ; INLINE VIEW 와 WITH 문사용예제 [INLINE VIEW 사용 QUERY] SDATE, SUM(SUM_AMT) FROM ( SDATE, NVL(AMT1,0) + NVL(AMT2,0) + NVL(AMT3,0) SUM_AMT FROM ( /*+ RESULT_CACHE */ SUBSTR(SDATE,1,6) SDATE, PROD, SUM(AMT1) AMT1, SUM(AMT2) AMT2, SUM(AMT3) AMT3 34 2013 기술백서 White Paper

FROM TB_RC_TEST_YYYYMMDD PROD ) UNION ALL SUBSTR(SDATE,1,6) SDATE, SUM(AMT1) + SUM(AMT2) + SUM(AMT3) SUM_AMT FROM TB_RC_TEST_SYSDATE WHERE SDATE < :SDATE PROD ) GROUP BY SDATE; [WITH 문사용 QUERY] WITH W_TB_RC_TEST_YYYYMMDD AS ( SDATE, NVL(AMT1,0) + NVL(AMT2,0) + NVL(AMT3,0) SUM_AMT FROM ( /*+ RESULT_CACHE */ SUBSTR(SDATE,1,6) SDATE, PROD, SUM(AMT1) AMT1, SUM(AMT2) AMT2, SUM(AMT3) AMT3 FROM TB_RC_TEST_YYYYMMDD PROD )) SDATE, SUM(SUM_AMT) FROM ( SDATE, SUM_AMT FROM W_TB_RC_TEST_YYYYMMDD UNION ALL SUBSTR(SDATE,1,6) SDATE, SUM(AMT1) + SUM(AMT2) + SUM(AMT3) SUM_AMT FROM TB_RC_TEST_SYSDATE WHERE SDATE < :SDATE PROD Part 1 ORACLE 35

) GROUP BY SDATE; [ 실행계획 ] call count cpu elapsed disk QUERY current rows Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 2 0.18 0.18 0 1413 0 2 total 4 0.18 0.19 0 1413 0 2 Rows (1st) Row Source OPERATION ---------- --------------------------------------------------- 2 SORT GROUP BY (cr=1413 pr=0 pw=0 time=188846 ) 1352 VIEW (cr=1413 pr=0 pw=0 time=2355 ) 1352 UNION-ALL (cr=1413 pr=0 pw=0 time=2230 us) 676 VIEW (cr=0 pr=0 pw=0 time=578 ) 676 RESULT CACHE gnxqgpxppdavj80b6rddg4qsqj (cr=0 pr=0 pw=0 time=126 us) 0 SORT GROUP BY (cr=0 pr=0 pw=0 time=0 ) 0 TABLE ACCESS FULL TB_RC_TEST_YYYYMMDD (cr=0 pr=0 pw=0 time=0 ) 676 SORT GROUP BY (cr=1413 pr=0 pw=0 time=187432 ) 104850 TABLE ACCESS FULL TB_RC_TEST_SYSDATE (cr=1413 pr=0 pw=0 time=57449 ) RESULT CACHE 사용시고려사항 DML 사용시고려사항 CACHING 된 OBJECT 에 DML( 변경사항 ) 이발생되면변경된시점에서 RESULT CACHE 기능은무효화된다. 그이유는 CACHING 된 OBJECT 가변경된다면 QUERY 의결과값에대한정합성을보장할수없기때문이다. 따라서 DML 이많이발생하는 OBJECT 는 RESULT CACHE 기능을사용하지않는것이좋다. BIND 사용시고려사항 BIND 변수의변경이많은 QUERY 에대해서도비효율이발생된다. 아래테스트결과를보면 BIND 변수값에따라독립적으로 CACHING 되는것을볼수있다. 그렇기때문에 BIND 변수가 36 2013 기술백서 White Paper

많아지면특정 QUERY 가 CACHE 의영역을모두사용할것이고 CACHE 하고자하는각기다 른쿼리들에의해 CACHE 의등록과해지가빈번하게발생되어 CACHE 의효율은떨어지게된 다. 같은 QUERY 에서 BIND 변수값이다양한경우 VAR NUM NUMBER; EXEC :NUM := 1; /*+ RESULT_CACHE */ 'CACHING Count' FROM DUAL WHERE 1 = :NUM; EXEC :NUM := 2; /*+ RESULT_CACHE */ 'CACHING Count' FROM DUAL WHERE 1 = :NUM; EXEC :NUM := 3; /*+ RESULT_CACHE */ 'CACHING Count' FROM DUAL WHERE 1 = :NUM; ID, TYPE, STATUS, BUCKET_NO, HASH,NAME FROM V$RESULT_CACHE_OBJECT; [ 결과값 ] ID TYPE STATUS BUCKET_NO HASH NAME - ---- --------- --------- ----------- -------------------------------------------- 3 RESULT Published 1882 2742746 /*+ RESULT_CACHE */ 'CACHING Count' FROM DUAL WHERE 1 = :A 2 RESULT Published 1714 7906098 /*+ RESULT_CACHE */ 'CACHING Count' FROM DUAL WHERE 1 = :A 1 RESULT Published 3880 95977768 /*+ RESULT_CACHE */ 'CACHING Count' FROM DUAL WHERE 1 = :A 0 RESULT Published 3157 98148181 /*+ RESULT_CACHE */ 'CACHING Count' FROM DUAL WHERE 1 = :A Part 1 ORACLE 37

특정 OBJECT 사용시고려사항 아래내용은쿼리결과집합을 CACHING 하지못하는경우이다. 임시테이블또는 DICTIONARY OBJECT (DBA_*, V$_*, GV$_* 등 ) 참조시 시퀀스 CURRVAL 및 NEXTVAL COLUMN 호출시 QUERY 에서 SQL 함수를사용할경우 - CURRENT_TIMESTAMP, LOCAL_TIMESTAMP, SYS_GUID, SYSDATE, SYSTIMESTAMP 등 결론 기존 QUERY 들은 I/O 가발생해야만결과집합을알수있다. 많지않은 BLOCK 이라도많은세션들이동시에같은 BLOCK 을사용한다면 WAIT EVENT 가발생한다. 이는좋은성능을기대하기어렵지만 RESULT CACHE 기능을사용하게되면 I/O 를전혀발생하지않는다는부분에있어상당한성능개선의효과가있다. 하지만그기능의장점과단점을잘알고사용해야만시스템을안정적으로사용할수있을것이다. 또한운영하고있는시스템을살펴보면 RESULT CACHE 기능을사용할수있는부분이있을것이다. 이기능을활용해서 I/O 성능을더욱개선시킨다면더욱안정화되고최적화된시스템으로발전하게될것이다. 38 2013 기술백서 White Paper