th0x4c 備忘録

[Oracle] 結果キャッシュ

目的

“結果キャッシュ” 機能を使用する。

環境

  • OS: Oracle Enterprise Linux 5.8
  • DB: Oracle Database 11g Release 2 (11.2.0.3)

マニュアル

結果キャッシュの使用

“結果キャッシュ” 機能を使用することで、問い合わせ結果を再利用してパフォーマンスを向上させることができる。

  • 初期化パラメータの設定

結果キャッシュを有効にするためには初期化パラメータ RESULT_CACHE_MAX_SIZE を 0 より大きくする必要がある。

0 の場合は結果キャッシュは無効となる。(以下のように DBMS_RESULT_CACHE.STATUS の結果が DISABLED となっている。)

SQL> show parameter result_cache_max_size

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
result_cache_max_size                big integer                       0
SQL> SELECT DBMS_RESULT_CACHE.STATUS FROM DUAL;

STATUS
----------
DISABLED

初期化パラメータ RESULT_CACHE_MAX_SIZE は以下のように動的に変更できるが、実際はインスタンスを再起動しないと有効にならなかった。

SQL> ALTER SYSTEM SET result_cache_max_size = 15M SCOPE=both;

System altered.

SQL> show parameter result_cache_max_size

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
result_cache_max_size                big integer                       15M
SQL> SELECT DBMS_RESULT_CACHE.STATUS FROM DUAL;

STATUS
----------
DISABLED

インスタンスを再起動すると、有効になり、DBMS_RESULT_CACHE.STATUSENABLED に変わる。

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  835104768 bytes
Fixed Size                  2232960 bytes
Variable Size             734006656 bytes
Database Buffers           92274688 bytes
Redo Buffers                6590464 bytes
Database mounted.
Database opened.
SQL> show parameter result_cache_max_size

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
result_cache_max_size                big integer                       15M
SQL> SELECT DBMS_RESULT_CACHE.STATUS FROM DUAL;

STATUS
----------
ENABLED
  • 結果キャッシュの使用

結果キャッシュを使用するには /*+ RESULT_CACHE */ ヒントを付与して問い合わせを実行すればよい。

SQL> SELECT /*+ RESULT_CACHE */ AVG(sal) FROM scott.emp;
  • 結果キャッシュの確認

実行計画で、RESULT CACHE と出ていると結果キャッシュが使われている。

SQL> set lines 200
SQL> set autotrace on
SQL> SELECT /*+ RESULT_CACHE */ AVG(sal) FROM scott.emp;

  AVG(SAL)
----------
2083.21429


Execution Plan
----------------------------------------------------------
Plan hash value: 2083865914

--------------------------------------------------------------------------------------------------
| Id  | Operation           | Name                       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |                            |     1 |     4 |     3   (0)| 00:00:01 |
|   1 |  RESULT CACHE       | 4z1ag1pqa9zqm704zf4nuj9tq4 |       |       |            |          |
|   2 |   SORT AGGREGATE    |                            |     1 |     4 |            |          |
|   3 |    TABLE ACCESS FULL| EMP                        |    14 |    56 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------

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

   1 - column-count=1; dependencies=(SCOTT.EMP); attributes=(single-row); name="SELECT /*+ RESULT_CACHE */ AVG(sal) FROM scott.emp"


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

また、V$RESULT_CACHE_OBJECTS からも結果キャッシュについて確認できる。

SQL> SELECT type, status, name FROM v$result_cache_objects;

TYPE                           STATUS
------------------------------ ---------------------------
NAME
--------------------------------------------------------------------------------
Dependency                     Published
SCOTT.EMP

Result                         Published
SELECT /*+ RESULT_CACHE */ AVG(sal) FROM scott.emp