2013년 11월 10일 일요일

[오라클SLQ튜닝]오라클 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 /*+ RESULT_CACHE */ 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을 실행 할 때마다 늘어 난 다는 것을 알 수 있다. 실습해 보라. [출처] 오라클자바커뮤니티 - http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=210 [개강임박강좌, 오프라인교육장에 오시면 보다 자세히 배울 수 있습니다.] 오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr) [주간] [11/18]Spring3.X, MyBatis, Hibernate실무과정 [11/18]iPhone 하이브리드 앱 개발 실무과정 [11/20]SQL초보에서실전전문가까지 [11/20]안드로이드개발자과정 [평일야간] [11/13]C#,ASP.NET마스터 [11/19]iPhone하이브리드앱개발실무과정 [11/19]안드로이드개발자과정 [11/20]초보자를위한실전SQL [11/21]JAVA&WEB프레임워자실무과정 [11/21]Spring3.X, MyBatis, Hibernate실무과정 [주말] [11/16]JAVA&WEB프레임워크실무과정 [11/16]웹퍼블리싱 마스터 [11/16]Spring3.X,MyBatis,Hibernate실무과정 [11/16]SQL초보에서전문가까지 [11/16]PL/SQL,오라클힌트,SQL튜닝,사례연구 [11/23]C#,ASP.NET마스터 


[ORACLE Tuning]오라클 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 /*+ RESULT_CACHE */
        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을 실행 할 때마다 늘어 난 다는 것을 알 수 있다.
실습해 보라. 

댓글 없음:

댓글 쓰기