参考文献

マニュアルを見ると

SQLの/*+ result_cache */または/*+ no_result_cache */ヒントを

設定する必要があります。

と書いてあります。

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

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

共有プールとリザルト・キャッシュのクリア

#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)

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 |
1RESULT CACHE6956nbb88zyah31kkck6uguu3k
    |          |

| 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)

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 |

3INDEX FULL SCANDEPT_ID_PK27
 |     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 |

6RESULT CACHE3n8nt1x1s56b57x5v4pmz5a5tm
 |            |          |

| 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> }}

問い合わせを実行

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> }}

メモリーの割当てと利用統計を参照

#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が成功したことを示しています。

再度問い合わせを実行

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

#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 使われていることがわかります。

キャッシュの状況を見る

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> }}



トップ   差分 履歴 リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-01-29 (土) 15:27:48