プライマリ・コンテンツに移動
Oracle® Databaseパフォーマンス・チューニング・ガイド
12cリリース1 (12.1)
B71276-05
目次へ移動
目次
索引へ移動
索引

前
次

15 結果キャッシュのチューニング

この章では、結果キャッシュのチューニング方法を説明しており、内容は次のとおりです。

結果キャッシュについて

結果キャッシュは共有グローバル領域(SGA)またはクライアント・アプリケーション・メモリー内のメモリー領域で、データベースの問合せまたは問合せブロックの結果を再利用するために格納します。キャッシュされた行は、失効しないかぎりSQL文およびセッション間で共有されます。

この項では、2つのタイプの結果キャッシュについて説明しており、内容は次のとおりです。

サーバー結果キャッシュの概念

サーバー結果キャッシュは共有プール内のメモリー・プールです。このメモリー・プールは、SQL問合せの結果を格納するSQL問合せの結果キャッシュと、PL/SQLファンクションによって戻される値を格納するPL/SQLファンクションの結果キャッシュで構成されています。

この項では、サーバー結果キャッシュについて説明しており、内容は次のとおりです。

関連項目:

  • サーバー結果キャッシュの詳細は、『Oracle Database概要』を参照してください

  • PL/SQLファンクション結果キャッシュの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください

サーバー結果キャッシュを使用する利点

サーバー結果キャッシュを使用する利点は、アプリケーションによって異なります。OLAPアプリケーションでは、使用により多大なメリットを得ることができます。たとえばデータ・ウェアハウスのように、アクセスする行数が多く、戻す行数の少ない問合せはキャッシュの対象として適しています。たとえば、表を使用するかわりに、同値化を伴う拡張クエリー・リライトを使用して、結果キャッシュに問合せをマテリアライズするマテリアライズド・ビューを作成できます。

関連項目:

結果キャッシュおよび同値化を伴う拡張問合せリライトの使用方法の詳細は、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照してください

サーバー結果キャッシュの機能について

問合せを実行すると、データベースはキャッシュ・メモリーを検索してその結果が結果キャッシュに存在するかどうかを判断します。結果が存在する場合、問合せを実行せずにメモリーから結果を取得します。結果がキャッシュされていない場合、データベースは問合せを実行して結果を出力として戻し、その結果を結果キャッシュに格納します。

ユーザーが問合せとファンクションを繰り返し実行する場合、データベースはキャッシュから行を取得するためレスポンス時間が短縮されます。依存するデータベース・オブジェクトのデータが変更された場合、キャッシュされた結果は無効になります。

次の各項には、サーバー結果キャッシュから結果を取得する方法の例が含まれます。

問合せで結果が取得される仕組み

次の例に、RESULT_CACHEヒントを使用して、サーバー結果キャッシュの行を取得するhr.employeesの問合せを示します。

SELECT /*+ RESULT_CACHE */ department_id, AVG(salary)
  FROM hr.employees
 GROUP BY department_id;

この問合せの実行計画の一部は次のようになります。

--------------------------------------------------------------
| Id | Operation          | Name                       |Rows
--------------------------------------------------------------
| 0 | SELECT STATEMENT    |                            | 11
| 1 |  RESULT CACHE       | 8fpza04gtwsfr6n595au15yj4y |
| 2 |   HASH GROUP BY     |                            | 11
| 3 |    TABLE ACCESS FULL| EMPLOYEES                  | 107
--------------------------------------------------------------

実行計画の手順1に示されているように、この例では、結果がキャッシュから直接取得されています。Name列の値は、結果のキャッシュIDです。

次の例に、キャッシュされた結果に関する詳細な統計を取得するためのV$RESULT_CACHE_OBJECTSビューの問合せを示します。

SELECT id, type, creation_timestamp, block_count,
       column_count, pin_count, row_count
  FROM V$RESULT_CACHE_OBJECTS
 WHERE cache_id = '8fpza04gtwsfr6n595au15yj4y';

この例において、CACHE_IDの値は、前述の例の実行計画から取得されたキャッシュIDです。この問合せの出力例を次に示します。

        ID TYPE       CREATION_ BLOCK_COUNT COLUMN_COUNT  PIN_COUNT  ROW_COUNT
---------- ---------- --------- ----------- ------------ ---------- ----------
         2 Result     06-NOV-11           1            2          0         12
ビューで結果が取得される仕組み

例15-1に、WITH句のビュー内でRESULT_CACHEヒントを使用する問合せを示します。

例15-1 WITHビューに指定されたRESULT_CACHEヒント

WITH summary AS
( SELECT /*+ RESULT_CACHE */ department_id, avg(salary) avg_sal
    FROM hr.employees
   GROUP BY department_id )
SELECT d.*, avg_sal
  FROM hr.departments d, summary s
 WHERE d.department_id = s.department_id;

この問合せの実行計画の一部は次のようになります。

------------------------------------------------------------------------------------------------
| Id| Operation             | Name                      | Rows | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|  0| SELECT STATEMENT      |                           |   11 |   517 |     7  (29)| 00:00:01 |
|* 1|  HASH JOIN            |                           |   11 |   517 |     7  (29)| 00:00:01 |
|  2|   VIEW                |                           |   11 |   286 |     4  (25)| 00:00:01 |
|  3|    RESULT CACHE       | 8nknkh64ctmz94a5muf2tyb8r |      |       |            |          |
|  4|     HASH GROUP BY     |                           |   11 |    77 |     4  (25)| 00:00:01 |
|  5|      TABLE ACCESS FULL| EMPLOYEES                 |  107 |   749 |     3   (0)| 00:00:01 |
|  6|   TABLE ACCESS FULL   | DEPARTMENTS               |   27 |   567 |     2   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

実行計画の手順3に示されているように、この例では、summaryビューの結果がキャッシュから直接取得されています。Name列の値は、結果のキャッシュIDです。

クライアント結果キャッシュの概念

Oracle Call Interface (OCI)クライアントの結果キャッシュは、OCIアプリケーションのSQL問合せの結果セットをキャッシュする、クライアント・プロセス内のメモリー領域です。クライアント・キャッシュは、各クライアント・プロセスに存在し、プロセス内のすべてのセッションによって共有されます。クライアント結果キャッシュは、読取り専用またはほぼ読取り専用の表の問合せにお薦めします。

注意:

クライアントの結果キャッシュは、SGA内に存在するサーバーの結果キャッシュとは異なります。クライアントの結果キャッシュが有効な場合、クライアント、サーバー、またはその両方で問合せ結果セットをキャッシュできます。クライアントのキャッシュは、サーバーの結果キャッシュが無効の場合も使用できます。

この項では、クライアント結果キャッシュについて説明しており、内容は次のとおりです。

クライアント結果キャッシュを使用する利点

OCCI、JDBC OCIドライバ、ODP.NETなどのOCIドライバは、クライアント結果キャッシュをサポートします。クライアント結果キャッシュを使用するパフォーマンスの利点は次のとおりです。

  • 問合せのレスポンス時間の短縮

    問合せが繰り返し実行される場合、アプリケーションは結果をクライアントのキャッシュ・メモリーから直接取得するため、問合せのレスポンス時間が短縮されます。

  • データベース・リソースの使用効率の向上

    サーバーのラウンドトリップが減少し、サーバーのCPUやI/Oなどのサーバー・リソースのパフォーマンスが大幅に節約されます。これらのリソースは他のタスクに解放されるため、サーバーのスケーラビリティが向上します。

  • メモリー・コストの削減

    結果キャッシュでは、サーバー・メモリーよりコストがかからないクライアント・メモリーが使用されます。

クライアント結果キャッシュの機能について

クライアントの結果キャッシュは、一番外側の問合せの結果(OCIアプリケーションで定義される列)を格納します。副問合せと問合せブロックはキャッシュされません。

図15-1は、データベースのログイン・セッションのクライアント・プロセスを示しています。このクライアント・プロセスにはクライアント結果キャッシュが1つあり、これはクライアント・プロセスで実行中の複数のアプリケーション・セッション間で共有されます。最初のアプリケーション・セッションが問合せを実行すると、データベースから行が取得され、クライアントの結果キャッシュにキャッシュされます。その他のアプリケーション・セッションが同じ問合せを実行する場合も、行はクライアントの結果キャッシュから取得されます。

図15-1 クライアントの結果キャッシュ

図15-1の説明が続きます
「図15-1 クライアントの結果キャッシュ」の説明

クライアントの結果キャッシュは、セッション状態、またはセッション状態に影響を与えるデータベースの変更と一致するように結果セットを透過的に維持します。キャッシュされた結果の構築に使用するデータベース・オブジェクトのデータまたはメタデータがトランザクションによって変更される場合、データベースは、サーバーへの次のラウンドトリップ時にOCIクライアントに無効化を送信します。

関連項目:

クライアントの結果キャッシュの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。

結果キャッシュの構成

この項では、サーバーおよびクライアントの結果キャッシュの構成方法を説明しており、内容は次のとおりです。

サーバー結果キャッシュの構成

デフォルトでは、Oracle Databaseによってデータベースの起動時に共有プール内のサーバーの結果キャッシュにメモリーが割り当てられます。割り当てられるメモリー・サイズは、共有プールのメモリー・サイズと選択されたメモリー管理システムに応じて変化します。

  • 自動共有メモリー管理

    SGA_TARGET初期化パラメータを使用して共有プールのサイズを管理している場合は、Oracle Databaseにより、SGA_TARGETパラメータの値の0.50%が結果キャッシュに割り当てられます。

  • 手動共有メモリー管理

    SHARED_POOL_SIZE初期化パラメータを使用して共有プールのサイズを管理している場合は、Oracle Databaseにより、共有プールのサイズの1%が結果キャッシュに割り当てられます。

注意:

Oracle Databaseでは、サーバーの結果キャッシュに共有プールの75%を超える容量が割り当てられることはありません。

サーバー結果キャッシュのサイズは、最大サイズに達するまで大きくなります。キャッシュ内の使用可能領域よりも大きな問合せ結果は、キャッシュされません。データベースは最低使用頻度(LRU)アルゴリズムを使用してキャッシュ済の結果を除去しますが、除去しない場合、メモリーはサーバー結果キャッシュから自動的に解放されません。

この項では、サーバー結果キャッシュの構成方法を説明しており、内容は次のとおりです。

初期化パラメータを使用したサーバー結果キャッシュのサイズ設定

表15-1に、サーバー結果キャッシュを制御するデータベース初期化パラメータを示します。

表15-1 サーバー結果キャッシュの初期化パラメータ

パラメータ 説明

RESULT_CACHE_MAX_SIZE

サーバー結果キャッシュに割り当てられるメモリーを指定します。サーバー結果キャッシュを無効化するには、このパラメータを0に設定します。

RESULT_CACHE_MAX_RESULT

1つの結果に使用可能なサーバー結果キャッシュの最大メモリー量(割合)を指定します。有効な値は1から100です。デフォルト値は5%です。このパラメータは、システム・レベルまたはセッション・レベルで設定できます。

RESULT_CACHE_REMOTE_EXPIRATION

サーバー結果キャッシュ内で、リモート・データベース・オブジェクトに依存する結果の有効期限(分単位)を指定します。デフォルト値は0で、これは、リモート・オブジェクトを使用する結果がキャッシュされないことを指定します。このパラメータに0以外の値が設定されている場合、サーバー結果キャッシュは、リモート・データベースに対するDMLでは無効化されません。

サーバー結果キャッシュに割り当てられたメモリーを変更するには、次のようにします。

  • RESULT_CACHE_MAX_SIZE初期化パラメータの値を必要なサイズに設定します。

    Oracle Real Application Clusters (Oracle RAC)環境では、結果キャッシュは各データベース・インスタンスに固有であり、インスタンスごとに個別にサイズ設定できます。ただし、無効化は、すべてのインスタンスにわたって機能します。クラスタ内のサーバー結果キャッシュを無効にするには、各インスタンスを起動する際に、このパラメータを0に明示的に設定する必要があります。

関連項目:

サーバー結果キャッシュの初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください

DBMS_RESULT_CACHEを使用したサーバー結果キャッシュの管理

DBMS_RESULT_CACHEパッケージでは、サーバーの結果キャッシュのメモリー割当てを管理できる統計、情報および演算子が提供されます。キャッシュ・メモリーの使用に関する統計の取得や、キャッシュのフラッシュなどの操作を実行するには、DBMS_RESULT_CACHEパッケージを使用します。

この項では、DBMS_RESULT_CACHEパッケージを使用したサーバー結果キャッシュの管理方法を説明しており、内容は次のとおりです。

サーバー結果キャッシュのメモリー使用統計の表示

この項では、DBMS_RESULT_CACHEパッケージを使用して、結果キャッシュのメモリー割当て統計を表示する方法を説明します。

結果キャッシュのメモリー使用統計を表示するには、次のようにします。

  • DBMS_RESULT_CACHE.MEMORY_REPORTプロシージャを実行します。

    例15-2に、このプロシージャの実行を示します。

例15-2 DBMS_RESULT_CACHEパッケージの使用

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 = 1024 bytes
Maximum Cache Size = 950272 bytes (928 blocks)
Maximum Result Size = 47104 bytes (46 blocks)
[Memory]
Total Memory = 46340 bytes [0.048% of the Shared Pool]
... Fixed Memory = 10696 bytes [0.011% of the Shared Pool]
... State Object Pool = 2852 bytes [0.003% of the Shared Pool]
... Cache Memory = 32792 bytes (32 blocks) [0.034% of the Shared Pool]
....... Unused Memory = 30 blocks
....... Used Memory = 2 blocks
........... Dependencies = 1 blocks
........... Results = 1 blocks
............... SQL = 1 blocks

PL/SQL procedure successfully completed.
サーバー結果キャッシュのフラッシュ

この項では、DBMS_RESULT_CACHEパッケージを使用して、既存の結果をすべて削除し、結果キャッシュ・メモリーを消去する方法を説明します。

サーバー結果キャッシュをフラッシュするには、次のようにします。

  • DBMS_RESULT_CACHE.FLUSHプロシージャを実行します。

関連項目:

DBMS_RESULT_CACHE パッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください

クライアント結果キャッシュの構成

表15-2に、クライアントの結果キャッシュの有効化またはキャッシュの動作に影響を与えるデータベース初期化パラメータを示します。

表15-2 クライアントの結果キャッシュの初期化パラメータ

パラメータ 説明

CLIENT_RESULT_CACHE_SIZE

クライアント・プロセスごとにクライアント結果キャッシュの最大サイズを指定します。クライアントの結果キャッシュを有効にするには、サイズを32768バイト以上に設定します。これよりも少ない値(デフォルトの0を含む)を設定すると、クライアント結果キャッシュは無効になります。

注意: CLIENT_RESULT_CACHE_SIZEの設定によってクライアントのキャッシュを無効にする場合、クライアント・ノードではクライアントのキャッシュを有効にできません。ただし、CLIENT_RESULT_CACHE_SIZEの設定によってクライアントのキャッシュを有効にすると、クライアント・ノードでその設定を上書きできます。たとえば、クライアント・ノードで、クライアントの結果キャッシュを無効にしたり、そのキャッシュ・サイズを増やしたりすることができます。

CLIENT_RESULT_CACHE_LAG

クライアント結果キャッシュのタイム・ラグ長(ミリ秒単位)を指定します。デフォルト値は3000(3秒)です。OCIアプリケーションが一定期間データベース・コールを実行しない場合、この設定によって、次の文の実行コールが検証のために確認されます。

OCIアプリケーションによるデータベースへのアクセス頻度が低い場合、このパラメータの値を小さくすると、クライアントの結果キャッシュとデータベースとの同期を維持する目的で、OCIクライアントからデータベースに対するラウンドトリップが増加します。

COMPATIBLE

互換性を維持しておくOracle Databaseのリリースを指定します。クライアントの結果キャッシュを有効にするには、このパラメータを11.0.0.0以上に設定する必要があります。クライアントのビューでのキャッシュの場合、このパラメータを11.2.0.0.0以上に設定する必要があります。

オプションのクライアント構成ファイルは、サーバー・パラメータ・ファイルに設定されているクライアント結果キャッシュの初期化パラメータを上書きします。

注意:

クライアント結果キャッシュ・ラグを設定できるのは、CLIENT_RESULT_CACHE_LAG初期化パラメータと一緒の場合のみです。

関連項目:

  • クライアント結果キャッシュの初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください

  • クライアント構成ファイルに設定可能なパラメータの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください

結果キャッシュ・モードの設定

結果キャッシュ・モードは、どの問合せがサーバーおよびクライアントの結果キャッシュに結果セットを格納する対象になるかを決定するデータベース設定です。問合せがキャッシュの対象である場合、アプリケーションは結果キャッシュを確認し、問合せ結果セットがキャッシュ内に存在するかどうかを調べます。存在する場合、結果キャッシュから結果を直接取得します。存在しない場合、データベースは問合せを実行して結果を出力として戻し、その結果を結果キャッシュに格納します。結果キャッシュは、読取り専用またはほぼ読取り専用のデータベース・オブジェクトの問合せにお薦めします。

結果キャッシュが有効化されている場合はデータベースでも、確定的ではないPL/SQLファンクションを呼び出す問合せがキャッシュされます。そのようなファンクションを呼び出すSELECT文をキャッシュする際、結果キャッシュは、PL/SQLファンクションおよびデータベース・オブジェクトに対するデータの依存性を追跡します。ただし、ファンクションが使用するデータが追跡されていない場合(順序、SYSDATESYS_CONTEXT、パッケージ変数など)、こうしたファンクションを呼び出す問合せで結果キャッシュを使用すると失効します。この点に関して、結果キャッシュの動作はPL/SQLファンクションのキャッシュと同一です。そのため、結果キャッシュを有効化する際は、パフォーマンスだけでなく、データの精度も常に考慮してください。

結果キャッシュ・モードを設定するには、次のようにします。

  • RESULT_CACHE_MODE初期化パラメータの値を設定し、結果キャッシュの動作を決定します。

    このパラメータは、インスタンス(ALTER SYSTEM)、セッション(ALTER SESSION)またはサーバー・パラメータ・ファイルで設定できます。

    表15-3に、このパラメータの値を説明します。

表15-3 RESULT_CACHE_MODEパラメータの値

説明

MANUAL

問合せヒントまたは表注釈を使用した場合のみ問合せの結果を結果キャッシュに格納できます。これがデフォルトで、推奨値です。

FORCE

すべての結果が結果キャッシュに格納されます。結果がキャッシュ内に存在しない場合、データベースは問合せを実行して結果をキャッシュに格納します。それ以降は、結果キャッシュ・ヒントを含め、同じSQL文が実行されると、キャッシュのデータが取得されます。可能な場合、これらの結果がセッションで使用されます。キャッシュからの問合せ結果を除外するには、/*+ NO_RESULT_CACHE */問合せヒントを使用する必要があります。

注意: FORCEモードでは、データベースおよびクライアントがすべての問合せをキャッシュしようとして、パフォーマンスおよびラッチの著しいオーバーヘッドが生じるため、お薦めできません。さらに、確定的でないPL/SQLファンクションを呼び出す問合せもキャッシュされるため、そのように対象範囲が広い場合の結果キャッシュは、大幅に結果を変える原因になる可能性があります。

関連項目:

RESULT_CACHE_MODE初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください

結果キャッシュの要件

結果キャッシュを有効化しても、サーバーまたはクライアントの結果キャッシュに特定の結果セットが含まれることは保証されません。結果がキャッシュされるには、次の要件が満たされている必要があります。

読取り一貫性の要件

スナップショットを再利用可能にするには、スナップショットの読取り一貫性を維持する必要があります。結果セットがキャッシュの対象になるには、少なくとも、次の条件のいずれか1つに当てはまる必要があります。

  • 結果の構築に使用される読取り一貫性スナップショットで、データの最新のコミット済状態を取得していること。

  • 問合せが、フラッシュバック問合せを使用して明示的な時点を示していること。

現在のセッションで、問合せ内にアクティブなトランザクションの参照オブジェクトがある場合、この問合せの結果はキャッシュの対象となりません。

問合せパラメータの要件

キャッシュの結果は、問合せが等価であり、パラメータ値が同じである場合、変数の値とともにパラメータ化されていれば再利用できます。値やバインド変数の名前が異なる場合、キャッシュ・ミスが生じる場合があります。次のいずれかの要素が問合せで使用されている場合、結果はパラメータ化されます。

  • バインド変数

  • SQLファンクションDBTIMEZONESESSIONTIMEZONEUSERENV/SYS_CONTEXT(定数変数を含む)、UIDおよびUSER

  • NLSパラメータ

結果キャッシュの制限

次のオブジェクトまたはファンクションが問合せ内にある場合、結果をキャッシュできません。

  • 一時表およびSYSまたはSYSTEMスキーマ内の表

  • 順序のCURRVALおよびNEXTVAL擬似列

  • SQLファンクションCURRENT_DATECURRENT_TIMESTAMPLOCAL_TIMESTAMPUSERENV/SYS_CONTEXT (非定数変数を含む)、SYS_GUIDSYSDATEおよびSYS_TIMESTAMP

クライアント結果キャッシュには、その他にも結果をキャッシュする際の制限があります。

関連項目:

クライアント結果キャッシュの追加の制限事項の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください

結果をキャッシュする問合せの指定

この項では、結果キャッシュの問合せの指定方法を説明しており、内容は次のとおりです。

SQLの結果キャッシュ・ヒントの使用

キャッシュの動作を制御するには、アプリケーション・レベルで結果キャッシュ・ヒントを使用します。SQLの結果キャッシュ・ヒントは、結果キャッシュのモードおよび表注釈よりも優先されます。

この項では、SQL結果キャッシ・ヒントの使用方法を説明しており、内容は次のとおりです。

関連項目:

RESULT_CACHEおよびNO_RESULT_CACHEヒントの詳細は、『Oracle Database SQL言語リファレンス』を参照してください

RESULT_CACHEヒントの使用

結果キャッシュ・モードがMANUALの場合、/*+ RESULT_CACHE */ヒントは、問合せブロックの結果をキャッシュに格納し、キャッシュされた結果を今後の実行で使用するようデータベースに指示します。

例15-3に、RESULT_CACHEヒントを使用する問合せを示します。

例15-3 RESULT_CACHEヒントの使用

SELECT /*+ RESULT_CACHE */ prod_id, SUM(amount_sold)
  FROM sales 
 GROUP BY prod_id
 ORDER BY prod_id;

この例では、sales表の問合せの行をキャッシュするよう、問合せがデータベースに指示します。

NO_RESULT_CACHEヒントの使用

/*+ NO_RESULT_CACHE */ヒントは、データベースがサーバーまたはクライアントの結果キャッシュに結果をキャッシュしないように指示します。

例15-4に、NO_RESULT_CACHEヒントを使用する問合せを示します。

例15-4 NO_RESULT_CACHEヒントの使用

SELECT /*+ NO_RESULT_CACHE */ prod_id, SUM(amount_sold) 
  FROM sales 
 GROUP BY prod_id
 ORDER BY prod_id;

この例では、sales表の問合せの行をキャッシュしないよう、問合せがデータベースに指示します。

ビューでのRESULT_CACHEヒントの使用

RESULT_CACHEヒントは、ヒントが指定された問合せブロックにのみ適用されます。ビューにのみヒントが指定されている場合は、その結果のみがキャッシュされます。ビュー・キャッシュには次の特性があります。

  • ビューは次のタイプである必要があります。

    • 標準ビュー(CREATE ... VIEW文で作成されたビュー)

    • SELECT文のFROM句に指定されたインライン・ビュー

    • WITH句を使用して作成されたインライン・ビュー

  • 相関列(外側の問合せブロックへの参照)を使用するビュー問合せの結果は、キャッシュできません。

  • 問合せの結果は、クライアントの結果キャッシュではなく、サーバーの結果キャッシュに格納されます。

  • キャッシュ・ビューは、外側の(または参照している)問合せブロックにマージされません。

    RESULT_CACHEヒントをインライン・ビューに追加すると、キャッシュ済結果の再利用性を最大化するために、外部問合せとインライン・ビュー間の最適化は無効化されます。

次の例に、インライン・ビューview1の問合せを示します。

SELECT *
  FROM ( SELECT /*+ RESULT_CACHE */ department_id, manager_id, count(*) count
           FROM hr.employees 
          GROUP BY department_id, manager_id ) view1
 WHERE department_id = 30;

この例において、view1SELECT文は外側のブロックで、employeesSELECT文は内側のブロックです。RESULT_CACHEヒントは内側のブロックにのみ指定されているため、内部問合せの結果はサーバー結果キャッシュに格納されますが、外側の問合せの結果はキャッシュされません。

次の例に示すように、同じセッションで、ビューview2の問合せが実行される場合を考えます。

WITH view2 AS
( SELECT /*+ RESULT_CACHE */ department_id, manager_id, count(*) count
    FROM hr.employees 
   GROUP BY department_id, manager_id ) 
SELECT *
  FROM view2 
 WHERE count BETWEEN 1 and 5;

この例では、WITH句の問合せブロックにのみRESULT_CACHEヒントが指定されているため、employeesの問合せ結果はキャッシュの対象となります。これらの結果は最初にあげた例の問合せからキャッシュされているため、2番目にあげた例のWITH句のSELECT文では、キャッシュされた行を取得できます。

結果キャッシュの表注釈の使用

結果キャッシュの制御には、表注釈を使用することもできます。表注釈は、問合せセグメントではなく、問合せ全体に影響します。表注釈を使用する主な利点は、結果キャッシュ・ヒントをアプリケーション・レベルで問合せに追加する必要がないことです。表注釈の優先度はSQL結果キャッシュ・ヒントより低いため、問合せレベルでヒントを使用することにより、表およびセッションの設定を上書きできます。

表15-4に、RESULT_CACHE表注釈の有効な値を示します。

表15-4 RESULT_CACHE表注釈の値

説明

DEFAULT

問合せの1つ以上の表がDEFAULTに設定されている場合、RESULT_CACHE_MODE初期化パラメータをFORCEに設定するか、RESULT_CACHEヒントを指定しないかぎり、この問合せの結果キャッシュは表レベルでは有効になりません。これがデフォルト値です。

FORCE

問合せのすべての表がFORCEに設定されている場合、問合せ結果はキャッシュ対象とみなされます。表注釈FORCEは、セッション・レベルで設定したRESULT_CACHE_MODEパラメータの値MANUALよりも優先されます。

この項では、RESULT_CACHE表注釈の使用方法を説明しており、内容は次のとおりです。

DEFAULT表注釈の使用

DEFAULT表注釈を使用すると、データベースによる表レベルの結果のキャッシュが行われません。

例15-5に、DEFAULT表注釈を使用して表salesおよびこの表の問合せを作成するCREATE TABLE文を示します。

例15-5 DEFAULT表注釈の使用

CREATE TABLE sales (...) RESULT_CACHE (MODE DEFAULT);

SELECT prod_id, SUM(amount_sold)
  FROM sales 
 GROUP BY prod_id 
 ORDER BY prod_id;

この例では、sales表は、結果キャッシュを無効化する表注釈を使用して作成されています。この例では、sales表の問合せの結果は、表注釈があるためにキャッシュの対象とみなされません。

関連項目:

CREATE TABLE文およびその構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

FORCE表注釈の使用

FORCE表注釈を使用すると、データベースでは、表レベルで結果がキャッシュされます。

例15-5で作成されたsales表を使用して、この表の結果キャッシュを強制することを決定した場合は、FORCE表注釈を使用してこれを実行できます。

例15-6に、sales表のFORCE表注釈を使用するALTER TABLE文を示します。

例15-6 FORCE表注釈の使用

ALTER TABLE sales RESULT_CACHE (MODE FORCE);

SELECT prod_id, SUM(amount_sold)
  FROM sales 
 GROUP BY prod_id 
HAVING prod_id=136;

SELECT /*+ NO_RESULT_CACHE */ * 
  FROM sales
 ORDER BY time_id DESC;

この例には、sales表の2つの問合せが含まれています。最初の問合せは使用頻度が高く数行を戻します。これは表注釈があるためキャッシュの対象となります。2番目の問合せは、1回かぎりの問合せで多くの行を戻します。この問合せではヒントを使用して、結果がキャッシュされないようにしています。

結果キャッシュの監視

サーバーおよびクライアントの結果キャッシュに関する情報を表示するには、関連するデータベース・ビューおよび表を問い合せます。

表15-5に、結果キャッシュの監視に最も役に立つビューおよび表を示します。

表15-5 結果キャッシュに関する情報を含むビューおよび表

ビュー/表 説明

V$RESULT_CACHE_STATISTICS

サーバーの結果キャッシュの様々な設定とメモリー使用量の統計のリスト。

V$RESULT_CACHE_MEMORY

サーバーの結果キャッシュのすべてのメモリー・ブロックとそれに対応する統計のリスト。

V$RESULT_CACHE_OBJECTS

結果がその属性とともにサーバーの結果キャッシュ内にあるすべてのオブジェクトのリスト。

V$RESULT_CACHE_DEPENDENCY

サーバー結果キャッシュ内の結果とこれらの結果の依存性間における依存関係の詳細のリスト。

CLIENT_RESULT_CACHE_STATS$

OCIクライアント・プロセスから取得されたクライアントの結果キャッシュのキャッシュ設定とメモリー使用量の統計を格納します。この統計表には、結果キャッシュを使用する各クライアント・プロセスのエントリが含まれます。クライアント・プロセスの終了後、エントリはこの表から削除されます。クライアント表には、V$RESULT_CACHE_STATISTICSに類似の情報が含まれます。

DBA_TABLESUSER_TABLESALL_TABLES

表の結果キャッシュ・モードの注釈を示すRESULT_CACHE列が含まれます。表に注釈が付いていない場合、この列にはDEFAULTと表示されます。この列は、サーバーとクライアントの両方の結果キャッシュに適用されます。

次の例に、サーバー結果キャッシュの統計を監視するためのV$RESULT_CACHE_STATISTICSビューの問合せを示します。

COLUMN name FORMAT a20
SELECT name, value
  FROM V$RESULT_CACHE_STATISTICS;

この問合せの出力例を次に示します。

NAME                          VALUE
--------------------     ----------
Block Size (Bytes)             1024
Block Count Maximum            3136
Block Count Current              32
Result Size Maximum (Blocks)    156
Create Count Success              2
Create Count Failure              0
Find Count                        0
Invalidation Count                0
Delete Count Invalid              0
Delete Count Valid                0

次の例に、クライアント結果キャッシュの統計を監視するためのCLIENT_RESULT_CACHE_STATS$表の問合せを示します。

SELECT stat_id, SUBSTR(name,1,20), value, cache_id
  FROM CLIENT_RESULT_CACHE_STATS$
 ORDER BY cache_id, stat_id;

この問合せの出力例を次に示します。

STAT_ID    NAME OF STATISTICS      VALUE   CACHE_ID
=======    ==================      =====   ========
    1      Block Size               256         124
    2      Block Count Max          256         124
    3      Block Count Current      128         124
    4      Hash Bucket Count       1024         124
    5      Create Count Success      10         124
    6      Create Count Failure       0         124
    7      Find Count                12         124
    8      Invalidation Count         8         124
    9      Delete Count Invalid       0         124
   10      Delete Count Valid         0         124

CLIENT_RESULT_CACHE_STATS$表には、クライアントの結果をキャッシュするアクティブな各クライアント・プロセスの統計エントリがあります。すべてのクライアント・プロセスには、一意のキャッシュIDがあります。

クライアントのキャッシュを実行しているセッションのクライアント接続情報を取得するには、次のようにします。

  1. CLIENT_RESULT_CACHE_STATS$表のCACHE_ID列に対応するGV$SESSION_CONNECT_INFOビューのCLIENT_REGID列からセッションIDを取得します。

  2. GV$SESSION_CONNECT_INFOおよびGV$SESSIONビューで関連する列を問い合せます。

サーバーとクライアントのどちらの結果キャッシュ統計の場合も、結果キャッシュ用に最適化されているデータベースでは、Create Count FailureおよびDelete Count Valid統計の値が比較的小さく、Find Count統計の値が比較的大きくなります。

関連項目:

これらのビューおよび表の詳細は、『Oracle Databaseリファレンス』を参照してください