マニュアルを見ると
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> }}
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つ目の例を実行してみます。
#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> }}
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> }}