#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