問い合わせ結果キャッシュの使用(11g)
1. 問い合わせ結果キャッシュの概念

Oracle社マニュアル 概要(11gR1) 第8章
Oracle社マニュアル パフォーマンス・チューニング・ガイド(11gR1) 7.6節

クライアント結果キャッシュ(OCI)

Oracle社マニュアル Oracle Call Interfaceプログラマーズ・ガイド(11gR1)

2. 問い合わせ結果キャッシュの設定
2.1 RESULT_CACHE_MAX_SIZE初期パラメータ
  • 構文:RESULT_CACHE_MAX_SIZE = integer [K | M | G]
  • このパラメータの値が0の場合、この機能は無効になる。
  • 結果キャッシュが共有プールに割り当てられる。
  • デフォルト値はSHARED_POOL_SIZE、SGA_TARGETおよびMEMORY_TARGETの値から導出される。
    • MEMORY_TARGETが設定されている場合、デフォルト値 = MEMORY_TARGET * 0.25%
    • SGA_TARGETが設定されている場合、デフォルト値 = SGA_TARGET * 0.5%
    • 上記の自動管理ではない場合、デフォルト値 = SHARED_POOL_SIZE * 1%
PROD(SYS)> alter system set result_cache_max_size=2M scope=both;

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

PROD(SYS)>
2.2 RESULT_CACHE_MODE初期パラメータ
  • 構文:RESULT_CACHE_MODE = { MANUAL | FORCE }
    • MANUAL:ResultCache演算子は、問合せに注釈(ヒント)を付ける場合にのみ追加される。
    • FORCE:ResultCache演算子は、SELECT文のルートに追加される。FORCE設定では、文にNO_RESULT_CACHEヒントが含まれている場合、このヒントはパラメータ設定より優先される。
  • デフォルトはMANUAL
PROD(SYS)> show parameter result_cache_mode

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
result_cache_mode                    string                            MANUAL
PROD(SYS)>
3. 結果キャッシュの使用
3.1 普通のように問い合わせを発行した場合
PROD(JASON)> select count(*) from t_obj,t_obj; --# 初回実行

  COUNT(*)
----------
 147428164

経過: 00:00:15.89
PROD(JASON)> set autot on
PROD(JASON)> select count(*) from t_obj,t_obj; --#2回目実行

  COUNT(*)
----------
 147428164

経過: 00:00:18.84

実行計画
----------------------------------------------------------
Plan hash value: 1148396445

-----------------------------------------------------------------------
| Id  | Operation             | Name  | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------------
|   0 | SELECT STATEMENT      |       |     1 |   677K  (1)| 02:15:31 |
|   1 |  SORT AGGREGATE       |       |     1 |            |          |
|   2 |   MERGE JOIN CARTESIAN|       |   205M|   677K  (1)| 02:15:31 |
|   3 |    TABLE ACCESS FULL  | T_OBJ | 14345 |    49   (0)| 00:00:01 |
|   4 |    BUFFER SORT        |       | 14345 |   677K  (1)| 02:15:31 |
|   5 |     TABLE ACCESS FULL | T_OBJ | 14345 |    47   (0)| 00:00:01 |
-----------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement

統計
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        332  consistent gets
          0  physical reads
          0  redo size
        445  bytes sent via SQL*Net to client
        420  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

PROD(JASON)>
3.2 /*+ result_cache */ヒントを指定
PROD(JASON)> select /*+ result_cache */ count(*) from t_obj,t_obj;

  COUNT(*)
----------
 147428164

経過: 00:00:00.01

実行計画
----------------------------------------------------------
Plan hash value: 1148396445

---------------------------------------------------------------------------------------------
| Id  | Operation              | Name                       | Rows  | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |                            |     1 |   677K  (1)| 02:15:31 |
|   1 |  RESULT CACHE          | baruz9chxjq5gftab7j5xw9k50 |       |            |          |
|   2 |   SORT AGGREGATE       |                            |     1 |            |          |
|   3 |    MERGE JOIN CARTESIAN|                            |   205M|   677K  (1)| 02:15:31 |
|   4 |     TABLE ACCESS FULL  | T_OBJ                      | 14345 |    49   (0)| 00:00:01 |
|   5 |     BUFFER SORT        |                            | 14345 |   677K  (1)| 02:15:31 |
|   6 |      TABLE ACCESS FULL | T_OBJ                      | 14345 |    47   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

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

   1 - column-count=1; dependencies=(JASON.T_OBJ); attributes=(single-row); name="select /*+ result_cache */ count(*) from t_obj,t_obj"

Note
-----
   - dynamic sampling used for this statement

統計
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
        445  bytes sent via SQL*Net to client
        420  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

PROD(JASON)>
3.3 RESULT_CACHE_MODEをFORCEに設定
PROD(JASON)> alter system set result_cache_mode=force scope=memory;

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

経過: 00:00:00.04
PROD(JASON)>

ヒントなしで問い合わせを発行
PROD(JASON)> select count(*) from t_obj,t_obj;

  COUNT(*)
----------
 147428164

経過: 00:00:00.02

実行計画
----------------------------------------------------------
Plan hash value: 1148396445

---------------------------------------------------------------------------------------------
| Id  | Operation              | Name                       | Rows  | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |                            |     1 |   677K  (1)| 02:15:31 |
|   1 |  RESULT CACHE          | baruz9chxjq5gftab7j5xw9k50 |       |            |          |  --# 結果キャッシュを利用した。
|   2 |   SORT AGGREGATE       |                            |     1 |            |          |
|   3 |    MERGE JOIN CARTESIAN|                            |   205M|   677K  (1)| 02:15:31 |
|   4 |     TABLE ACCESS FULL  | T_OBJ                      | 14345 |    49   (0)| 00:00:01 |
|   5 |     BUFFER SORT        |                            | 14345 |   677K  (1)| 02:15:31 |
|   6 |      TABLE ACCESS FULL | T_OBJ                      | 14345 |    47   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

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

   1 - column-count=1; dependencies=(JASON.T_OBJ); attributes=(single-row); name="select count(*) from t_obj,t_obj"

Note
-----
   - dynamic sampling used for this statement

統計
----------------------------------------------------------
          8  recursive calls
          0  db block gets
        148  consistent gets
          0  physical reads
          0  redo size
        445  bytes sent via SQL*Net to client
        420  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

PROD(JASON)>

ヒント/*+ no_result_cache */を指定して強制に結果キャッシュを使わせない
PROD(JASON)> select /*+ no_result_cache */ count(*) from t_obj,t_obj;

  COUNT(*)
----------
 147428164

経過: 00:00:12.19

実行計画
----------------------------------------------------------
Plan hash value: 1148396445

-----------------------------------------------------------------------
| Id  | Operation             | Name  | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------------
|   0 | SELECT STATEMENT      |       |     1 |   677K  (1)| 02:15:31 |
|   1 |  SORT AGGREGATE       |       |     1 |            |          |
|   2 |   MERGE JOIN CARTESIAN|       |   205M|   677K  (1)| 02:15:31 |
|   3 |    TABLE ACCESS FULL  | T_OBJ | 14345 |    49   (0)| 00:00:01 |
|   4 |    BUFFER SORT        |       | 14345 |   677K  (1)| 02:15:31 |
|   5 |     TABLE ACCESS FULL | T_OBJ | 14345 |    47   (0)| 00:00:01 |
-----------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement

統計
----------------------------------------------------------
          7  recursive calls
          0  db block gets
        480  consistent gets
          0  physical reads
          0  redo size
        445  bytes sent via SQL*Net to client
        420  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

PROD(JASON)>
4. DBMS_RESULT_CACHEによって結果キャッシュの管理

Oracle社マニュアル DBMS_RESULT_CACHEパッケージ

4.1 メモリ使用レポート
PROD(JASON)> exec DBMS_RESULT_CACHE.MEMORY_REPORT(TRUE);
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  = 2M bytes (2K blocks)
Maximum Result Size = 102K bytes (102 blocks)
[Memory]
Total Memory = 103528 bytes [0.075% of the Shared Pool]
... Fixed Memory = 5132 bytes [0.004% of the Shared Pool]
....... Cache Mgr  = 108 bytes
....... Memory Mgr = 124 bytes
....... Bloom Fltr = 2K bytes
....... State Objs = 2852 bytes
... Dynamic Memory = 98396 bytes [0.071% of the Shared Pool]
....... Overhead = 65628 bytes
........... Hash Table    = 32K bytes (4K buckets)
........... Chunk Ptrs    = 12K bytes (3K slots)
........... Chunk Maps    = 12K bytes
........... Miscellaneous = 8284 bytes
....... Cache Memory = 32K bytes (32 blocks)
........... Unused Memory = 20 blocks
........... Used Memory = 12 blocks
............... Dependencies = 1 blocks (1 count)
............... Results = 11 blocks
................... SQL     = 9 blocks (9 count)
................... Invalid = 2 blocks (2 count)

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

結果キャッシュからすべてのオブジェクトを削除しようとする。

PROD(JASON)> select /*+ result_cache */ count(*) from t_obj,t_obj; --# 結果をキャッシュさせる。

  COUNT(*)
----------
 147428164

PROD(JASON)> select name, status, row_count,creation_timestamp from v$result_cache_objects;

NAME                                                                             STATUS                       ROW_COUNT CREATION
-------------------------------------------------------------------------------- --------------------------- ---------- --------
JASON.T_OBJ                                                                      Published                            0 10-02-18

PROD(JASON)> exec DBMS_RESULT_CACHE.FLUSH; --# FLUSH

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

PROD(JASON)> select name, status, row_count,creation_timestamp from v$result_cache_objects; --# 無くなった。

レコードが選択されませんでした。

PROD(JASON)>
4.3 情報確認
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License