2013년 8월 26일 월요일

query result cache in oracle 11g [ORACLEJAVA커뮤니티자바오라클교육강좌오라클자바교육강좌,자바교육오라클교육]

[ORACLEJAVA커뮤니티자바오라클교육강좌오라클자바교육강좌,자바교육오라클교육]

query result cache in oracle 11g
 
오라클자바커뮤니티에서 설립한  개발자실무교육6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr 


 
오라클 11g의 캐싱은  쿼리의 결과를 캐싱 하는 특징이 있는데 예를 보자.
 
SQL> SELECT name, value, isdefault
    FROM   v$parameter
    WHERE  name LIKE 'result_cache%';
 
NAME                               VALUE              ISDEFAULT
---------------------------------- ------------------ ---------
result_cache_mode                  MANUAL             TRUE
result_cache_max_size              3244032            TRUE
result_cache_max_result            5                  TRUE
result_cache_remote_expiration     0                  TRUE
 
 
4 rows selected.
 
 
result_cache_mode: Result Cache는 세가지 방법으로 Oracle Hint or alter session, alter system으로 가능하다. Default 값이 MANUAL인데 “RESULT_CACHE”힌트를 명시해야 결과값 캐싱이 된다.
 
result_cache_max_size : 캐싱되는 최대 바이트 사이즈
 
result_cache_max_result: 단일 resultset에서 캐시되는 최대 비율(기본 5%)
 
result_cache_remote_expiration: 원격오브젝트에 대한 쿼리 결과로 캐싱 되어 유효한 시간. 기본 0
 
SQL>ALTER SYSTEM SET result_cache_max_size = 2M SCOPE = MEMORY
 
SQL> SELECT name, value
  2  FROM   v$parameter
  3  WHERE  name = 'result_cache_max_size';
 
NAME                                     VALUE
---------------------------------------- -------------------------
result_cache_max_size                    2097152
 
1 row selected.
 
 
이번에는 result cache manually
 
SQL> SELECT value
  2  FROM   v$parameter
  3  WHERE  name = 'result_cache_mode';
 
VALUE
----------------
MANUAL
 
1 row selected.
 
 
 
 
 
SQL> set autotrace traceonly
 
SQL> set timing on
 
SQL> SELECT
         e.empno,
         d.dname
    FROM   emp e
    ,      dept d
    WHERE  e.deptno = d.deptno
     ANd   e.deptno = 10;
 
EMPNO      DNAME         
---------- --------------
      7782 ACCOUNTING   
      7839 ACCOUNTING   
      7934 ACCOUNTING
 
 
|   0 | SELECT STATEMENT              |                            |     5 |   1
00 |     4   (0)| 00:00:01 |
|   1 |  RESULT CACHE                 | 4tg609zzhkhzs1k1wkzvcsrduk |       |
   |            |          |
|   2 |   NESTED LOOPS                |                            |     5 |   1
00 |     4   (0)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| DEPT                       |     1 |
13 |     1   (0)| 00:00:01 |
|*  4 |     INDEX UNIQUE SCAN         | PK_DEPT                    |     1 |
   |     0   (0)| 00:00:01 |
|*  5 |    TABLE ACCESS FULL          | EMP                        |     5 |
35 |     3   (0)| 00:00:01 |
 
 
 
 
이런데 힌트를 써서 결과값을 캐싱 가능한데, 과연 캐싱이 몇번 일어 났는지는 어떻게 확인 할까?
 
SELECT value
  FROM   v$result_cache_statistics
WHERE  name = 'Find Count';
 
 
 
SQL> SELECT value
  FROM   v$result_cache_statistics
  WHERE  name = 'Find Count';
 
VALUE                                                                            
---------------------------------------------------------------------------------
6
 

캐시 카운터는 SQL을 실행 할 때마다 늘어 난 다는 것을 알 수 있다.

댓글 없음:

댓글 쓰기