#topicpath

* 参考文献 [#x80ef733]

- [[Oracle Call Interfaceプログラマーズ・ガイド 11g リリース1(11.1):http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/appdev.111/E05677-02/toc.htm]]
- [[リザルト・キャッシュによるアプリケーション・パフォーマンスの向上:http://www.oracle.com/technology/global/jp/obe/11gr1_db/perform/rescache/res_cache.htm]]

マニュアルを見ると

> SQLの/*+ result_cache */または/*+ no_result_cache */ヒントを
> 設定する必要があります。

と書いてあります。

実際に OBE で練習してみました。

SQLの例だけやってみます。

* 共有プールとリザルト・キャッシュのクリア [#m7db066f]

#pre{{
SQL> set serveroutput on
SQL> execute dbms_result_cache.flush

PL/SQLプロシージャが正常に完了しました。

SQL>  alter system flush shared_pool
  2  /

システムが変更されました。

SQL> execute dbms_result_cache.memory_report
R e s u l t   C a c h e   M e m o r y   R e p o r t
[Parameters]
Block Size          = 1K bytes
Maximum Cache Size  = 1280K bytes (1280 blocks)
Maximum Result Size = 64K bytes (64 blocks)
[Memory]
Total Memory = 10696 bytes [0.006% of the Shared Pool]
... Fixed Memory = 10696 bytes [0.006% of the Shared Pool]
... Dynamic Memory = 0 bytes [0.000% of the Shared Pool]

PL/SQLプロシージャが正常に完了しました。

SQL> 
}}

* 実行計画の調査 (1) [#u56200db]

result_cache ヒントを使ってみます。

#pre{{
[oracle@ora1 res_cache]$ sqlplus hr/hrhrhrhr0@orcl
...
SQL> explain plan for 
  2  select /*+ result_cache q_name(Q1) */ * from departments;

解析されました。

SQL> @?/rdbms/admin/utlxpls

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 4167016233

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

| Id  | Operation          | Name                       | Rows  | Bytes | Cost (
%CPU)| Time     |

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


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                            |    27 |   567 |     3
  (0)| 00:00:01 |

|   1 |  RESULT CACHE      | 6956nbb88zyah31kkck6uguu3k |       |       |
     |          |

|   2 |   TABLE ACCESS FULL| DEPARTMENTS                |    27 |   567 |     3
  (0)| 00:00:01 |

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

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------


Result Cache Information (identified by operation id):
------------------------------------------------------

   1 - column-count=4; dependencies=(HR.DEPARTMENTS); name="select /*+ result_ca
che q_name(Q1) */ * from departments"


14行が選択されました。

SQL> 
}}

* 実行計画の調査 (2) [#n877c6e6]

2つ目の例を実行してみます。

#pre{{
SQL> explain plan for 
  2  select department_name, emp_count
  3  from (select /*+ result_cache q_name(Q2) */
  4        department_id, count(*) emp_count
  5        from employees
  6        group by department_id) e, departments d
  7  where e.department_id = d.department_id;

解析されました。

SQL> @?/rdbms/admin/utlxpls

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 523547400

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

| Id  | Operation                    | Name                       | Rows  | Byte
s | Cost (%CPU)| Time     |

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


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                            |    11 |   46
2 |     7  (29)| 00:00:01 |

|   1 |  MERGE JOIN                  |                            |    11 |   46
2 |     7  (29)| 00:00:01 |

|   2 |   TABLE ACCESS BY INDEX ROWID| DEPARTMENTS                |    27 |   43
2 |     2   (0)| 00:00:01 |

|   3 |    INDEX FULL SCAN           | DEPT_ID_PK                 |    27 |
  |     1   (0)| 00:00:01 |

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

|*  4 |   SORT JOIN                  |                            |    11 |   28
6 |     5  (40)| 00:00:01 |

|   5 |    VIEW                      |                            |    11 |   28
6 |     4  (25)| 00:00:01 |

|   6 |     RESULT CACHE             | 3n8nt1x1s56b57x5v4pmz5a5tm |       |
  |            |          |

|   7 |      HASH GROUP BY           |                            |    11 |    3

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
3 |     4  (25)| 00:00:01 |

|   8 |       TABLE ACCESS FULL      | EMPLOYEES                  |   107 |   32
1 |     3   (0)| 00:00:01 |

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


Predicate Information (identified by operation id):
---------------------------------------------------

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

   4 - access("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID")
       filter("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID")

Result Cache Information (identified by operation id):
------------------------------------------------------

   6 - column-count=2; dependencies=(HR.EMPLOYEES); name="select /*+ result_cach
e q_name(Q2) */
      department_id, count(*) emp_count
      from employees

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
      group by department_id"


26行が選択されました。

SQL> 
}}

* 問い合わせを実行 [#g6f90dda]

Q1 と Q2 のそれぞれを実行してみます。

#pre{{
SQL> select /*+ result_cache q_name(Q1) */ * from departments;

...
27行が選択されました。

SQL> 
}}

#pre{{
SQL> select department_name, emp_count
  2  from (select /*+ result_cache q_name(Q2) */
  3        department_id, count(*) emp_count
  4        from employees
  5        group by department_id) e, departments d
  6  where e.department_id = d.department_id;

...
11行が選択されました。

SQL> 
}}

* メモリーの割当てと利用統計を参照 [#m241f404]

#pre{{
SQL> connect sys/oracle@orcl as sysdba
接続されました。
SQL> col name format a30
SQL> col value format a10
SQL> select * from v$result_cache_statistics;

        ID NAME                           VALUE
---------- ------------------------------ ----------
         1 Block Size (Bytes)             1024
         2 Block Count Maximum            1280
         3 Block Count Current            32
         4 Result Size Maximum (Blocks)   64
         5 Create Count Success           2
         6 Create Count Failure           0
         7 Find Count                     0
         8 Invalidation Count             0
         9 Delete Count Invalid           0
        10 Delete Count Valid             0
        11 Hash Chain Length              1

11行が選択されました。

SQL> 
}}

Create Count Success が 2 になっていて、
2つのqueryが成功したことを示しています。

* 再度問い合わせを実行 [#f56772df]

キャッシュが効いているかどうか、再度実行してみます。

#pre{{
SQL> conn hr/hrhrhrhr0@orcl
接続されました。
SQL> select /*+ result_cache q_name(Q1) */ * from departments;

...
27行が選択されました。

SQL> 
SQL> select department_name, emp_count
  2  from (select /*+ result_cache q_name(Q2) */
  3        department_id, count(*) emp_count
  4        from employees
  5        group by department_id) e, departments d
  6  where e.department_id = d.department_id;

...
11行が選択されました。

SQL> 
}}

再度 v$result_cache_statistics を見てみます。

#pre{{
SQL> conn sys/oracle@orcl as sysdba
接続されました。
SQL> col name format a30
SQL> col value format a10
SQL> select * from v$result_cache_statistics;

        ID NAME                           VALUE
---------- ------------------------------ ----------
         1 Block Size (Bytes)             1024
         2 Block Count Maximum            1280
         3 Block Count Current            32
         4 Result Size Maximum (Blocks)   64
         5 Create Count Success           2
         6 Create Count Failure           0
         7 Find Count                     2
         8 Invalidation Count             0
         9 Delete Count Invalid           0
        10 Delete Count Valid             0
        11 Hash Chain Length              1

11行が選択されました。

SQL> 
}}

Find Count が 2 になっています。

メモリー・キャッシュの状況も見てみます。

#pre{{
SQL> set serveroutput on
SQL> execute dbms_result_cache.memory_report
R e s u l t   C a c h e   M e m o r y   R e p o r t
[Parameters]
Block Size          = 1K bytes
Maximum Cache Size  = 1280K bytes (1280 blocks)
Maximum Result Size = 64K bytes (64 blocks)
[Memory]
Total Memory = 174752 bytes [0.095% of the Shared Pool]
... Fixed Memory = 10696 bytes [0.006% of the Shared Pool]
... Dynamic Memory = 164056 bytes [0.089% of the Shared Pool]
....... Overhead = 131288 bytes
....... Cache Memory = 32K bytes (32 blocks)
........... Unused Memory = 28 blocks
........... Used Memory = 4 blocks
............... Dependencies = 2 blocks (2 count)
............... Results = 2 blocks
................... SQL     = 2 blocks (2 count)

PL/SQLプロシージャが正常に完了しました。

SQL> 
}}

Dynamic Memory が 0 だったのが 164056 bytes 使われていることがわかります。

* キャッシュの状況を見る [#e2203d76]

v$result_cache_objects で何がキャッシュに載っているかを
見ることができます。

#pre{{
SQL> set linesize 150
SQL> col type format a10
SQL> col namespace format a10
SQL> col status format a10
SQL> col name format a60
SQL> select type,namespace,status,scan_count,name        
  2  from v$result_cache_objects
  3  /

TYPE       NAMESPACE  STATUS     SCAN_COUNT NAME
---------- ---------- ---------- ---------- ------------------------------------------------------------
Dependency            Published           0 HR.EMPLOYEES
Dependency            Published           0 HR.DEPARTMENTS
Result     SQL        Published           1 select /*+ result_cache q_name(Q2) */
                                                  department_id, count(*) emp_count
                                                  from employees
                                                  group by department_id

Result     SQL        Published           1 select /*+ result_cache q_name(Q1) */ * from departments

SQL> 
}}

----
#comment

トップ   差分 履歴 リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS