17 結果キャッシュのチューニング
この章では、結果キャッシュのチューニング方法を説明しており、内容は次のとおりです。
結果キャッシュについて
結果キャッシュは共有グローバル領域(SGA)またはクライアント・アプリケーション・メモリー内のメモリー領域で、データベースの問合せまたは問合せブロックの結果を再利用するために格納します。キャッシュされた行は、失効しないかぎりSQL文およびセッション間で共有されます。
サーバー結果キャッシュの概念
サーバーの結果キャッシュは共有プール内のメモリー・プールです。このメモリー・プールは、SQL問合せの結果を格納するSQL問合せの結果キャッシュと、PL/SQLファンクションによって戻される値を格納するPL/SQLファンクションの結果キャッシュで構成されています。
この項では、サーバー結果キャッシュについて説明しており、内容は次のとおりです。
サーバー結果キャッシュの機能について
問合せを実行すると、データベースはキャッシュ・メモリーを検索してその結果が結果キャッシュに存在するかどうかを判断します。結果が存在する場合、問合せを実行せずにメモリーから結果を取得します。結果がキャッシュされていない場合、データベースは問合せを実行して結果を出力として戻し、その結果を結果キャッシュに格納します。
ユーザーが問合せとファンクションを繰り返し実行する場合、データベースはキャッシュから行を取得するためレスポンス時間が短縮されます。依存するデータベース・オブジェクトのデータが変更された場合、キャッシュされた結果は無効になります。
次の各項には、サーバー結果キャッシュから結果を取得する方法の例が含まれます。
問合せで結果が取得される仕組み
次の例に、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
ビューで結果が取得される仕組み
例17-1では、WITH句のビュー内でRESULT_CACHEヒントを使用する問合せを示します。
例17-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アプリケーションで定義される列)を格納します。副問合せと問合せブロックはキャッシュされません。
次の図は、データベースのログイン・セッションのクライアント・プロセスを示しています。このクライアント・プロセスにはクライアント結果キャッシュが1つあり、これはクライアント・プロセスで実行中の複数のアプリケーション・セッション間で共有されます。最初のアプリケーション・セッションが問合せを実行すると、データベースから行が取得され、クライアントの結果キャッシュにキャッシュされます。その他のアプリケーション・セッションが同じ問合せを実行する場合も、行はクライアントの結果キャッシュから取得されます。
クライアントの結果キャッシュは、セッション状態、またはセッション状態に影響を与えるデータベースの変更と一致するように結果セットを透過的に維持します。キャッシュされた結果の構築に使用するデータベース・オブジェクトのデータまたはメタデータがトランザクションによって変更される場合、データベースは、サーバーへの次のラウンドトリップ時にOCIクライアントに無効化を送信します。
関連項目:
クライアントの結果キャッシュの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。
結果キャッシュのブラウンアウトおよび自動除外
ブラウンアウトは、過剰なブロードキャストされた無効化メッセージによってシステムに負荷がかかるような状況です。
適応結果キャッシュ・オブジェクトの除外または自動除外(または単にブロック・リスト)は、潜在的なブラウンアウト状況を検出し、オブジェクトを識別し、結果キャッシュからそのオブジェクトを除外する23aiの機能です。
キャッシュに値しないオブジェクトのブロック・リストは、init.oraパラメータRESULT_CACHE_AUTO_BLOCKLISTを使用して有効化されます。有効化されると、データベースはバックグラウンドでホット表を定期的に検出し、それらをブロック・リストに登録します。
オブジェクトがブロック・リストに登録された理由を確認するには、ビューV$SQLとそのRESULT_CACHE_REJECTION_REASON列を使用して、オブジェクトのrejection codeを確認します。
ノート:
「ブロック・リストの理由」の項には、拒否コード、その意味および推奨される修正作業の表があります。同じ表は、『Oracle Databaseリファレンス』のV_SQLパラメータ・リストの近くで公開されています。
ブロック・リストは、DBMS_RESULT_CACHE.BLOCKLIST_ADDを使用して追加できます。ブロック・リストは、DBMS_RESULT_CACHE.IGNORE_LISTを使用してignore listにオブジェクトを追加することで上書きできます。無視リスト内のオブジェクトは、自動ブロック・リスト対象とみなされません。無視リストに対してオブジェクトを個別に追加および削除でき、無視リスト自体をクリアできます。
V_RESULT_CACHE_OBJECTSには、TIME_SAVEDおよびINVALIDATION_COSTの統計が表示されます。
特定のオブジェクトを収集してブロック・リストに登録するために使用される統計の一部を次に示します。
- 無効化メッセージのラウンドトリップ時間。
- オブジェクト当たりの最近の無効化の数。
- オブジェクト当たりの保存合計時間。
- 無効化の合計コスト
結果キャッシュの構成
この項では、サーバーおよびクライアントの結果キャッシュの構成方法を説明しており、内容は次のとおりです。
サーバー結果キャッシュの構成
デフォルトでは、Oracle Databaseによってデータベースの起動時に共有プール内のサーバーの結果キャッシュにメモリーが割り当てられます。割り当てられるメモリー・サイズは、共有プールのメモリー・サイズと選択されたメモリー管理システムに応じて変化します。
-
適応結果キャッシュ・オブジェクトの除外
キャッシュに値しないオブジェクトのブロック・リストは、
ora.initパラメータRESULT_CACHE_AUTO_BLOCKLISTを使用して有効化されます。有効化されると、バックグラウンド・アクション・グループが定期的に実行され、ホット表が検索され、それらがブロック・リストに登録されます。 -
自動共有メモリー管理
SGA_TARGET初期化パラメータを使用して共有プールのサイズを管理している場合は、Oracle Databaseにより、SGA_TARGETパラメータの値の0.50%が結果キャッシュに割り当てられます。 -
手動共有メモリー管理
SHARED_POOL_SIZE初期化パラメータを使用して共有プールのサイズを管理している場合は、Oracle Databaseにより、共有プールのサイズの1%が結果キャッシュに割り当てられます。
ノート:
Oracle Databaseでは、サーバーの結果キャッシュに共有プールの75%を超える容量が割り当てられることはありません。
サーバー結果キャッシュのサイズは、最大サイズに達するまで大きくなります。キャッシュ内の使用可能領域よりも大きな問合せ結果はキャッシュされませんが、有効になっている場合は、一時にあふれる可能性があります。(「結果キャッシュ・モードの設定」を参照してください。) データベースは最低使用頻度(LRU)アルゴリズムを使用してキャッシュ済の結果を除去しますが、除去しない場合、メモリーはサーバー結果キャッシュから自動的に解放されません。
この項では、メモリー内のサーバー結果キャッシュの構成方法を説明しており、内容は次のとおりです。
初期化パラメータを使用したサーバー結果キャッシュのサイズ設定
表17-1に、サーバーの結果キャッシュを制御するデータベース初期化パラメータを示します。
表17-1 メモリーに関連するサーバー結果キャッシュの初期化パラメータ
| パラメータ | 説明 |
|---|---|
|
|
サーバー結果キャッシュに割り当てられるメモリーを指定します。サーバー結果キャッシュを無効化するには、このパラメータを0に設定します。 |
|
|
1つの結果に使用可能なサーバー結果キャッシュの最大メモリー量(割合)を指定します。有効な値は1から100です。デフォルト値は5%です。このパラメータは、システム・レベルまたはセッション・レベルで設定できます。 |
|
|
サーバー結果キャッシュ内で、リモート・データベース・オブジェクトに依存する結果の有効期限(分単位)を指定します。デフォルト値は0で、これは、リモート・オブジェクトを使用する結果がキャッシュされないことを指定します。このパラメータに0以外の値が設定されている場合、サーバー結果キャッシュは、リモート・データベースに対するDMLでは無効化されません。 |
関連項目:
これらの初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください。
サーバー結果キャッシュに割り当てられたメモリーを変更するには:
-
RESULT_CACHE_MAX_SIZE初期化パラメータの値を必要なサイズに設定します。Oracle Real Application Clusters (Oracle RAC)環境では、結果キャッシュは各データベース・インスタンスに固有であり、インスタンスごとに個別にサイズ設定できます。ただし、無効化は、すべてのインスタンスにわたって機能します。クラスタ内のサーバー結果キャッシュを無効にするには、各インスタンスを起動する際に、このパラメータを0に明示的に設定する必要があります。
DBMS_RESULT_CACHEを使用したサーバー結果キャッシュの管理
DBMS_RESULT_CACHEパッケージでは、サーバーの結果キャッシュのメモリー割当てを管理できる統計、情報および演算子が提供されます。キャッシュ・メモリーの使用に関する統計の取得や、キャッシュのフラッシュなどの操作を実行するには、DBMS_RESULT_CACHEパッケージを使用します。
サーバー結果キャッシュのメモリー使用統計の表示
この項では、DBMS_RESULT_CACHEパッケージを使用して、結果キャッシュのメモリー割当て統計を表示する方法を説明します。
結果キャッシュのメモリー使用統計を表示するには:
-
DBMS_RESULT_CACHE.MEMORY_REPORTプロシージャを実行します。例17-2では、このプロシージャの実行を示します。
例17-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パッケージおよびタイプ・リファレンス』を参照してください
クライアント結果キャッシュの構成
表17-2では、クライアントの結果キャッシュを有効化するためや結果キャッシュの動作に影響を与えるためのデータベース初期化パラメータを示します。
表17-2 クライアントの結果キャッシュの初期化パラメータ
| パラメータ | 説明 |
|---|---|
|
|
クライアント・プロセスごとにクライアント結果キャッシュの最大サイズを指定します。クライアントの結果キャッシュを有効にするには、サイズを32768バイト以上に設定します。これよりも少ない値(デフォルトの0を含む)を設定すると、クライアント結果キャッシュは無効になります。 ノート: |
|
|
クライアント結果キャッシュのタイム・ラグ長(ミリ秒単位)を指定します。デフォルト値は3000(3秒)です。OCIアプリケーションが一定期間データベース・コールを実行しない場合、この設定によって、次の文の実行コールが検証のために確認されます。 OCIアプリケーションによるデータベースへのアクセス頻度が低い場合、このパラメータの値を小さくすると、クライアントの結果キャッシュとデータベースとの同期を維持する目的で、OCIクライアントからデータベースに対するラウンドトリップが増加します。 |
|
|
互換性を維持しておくOracle Databaseのリリースを指定します。 |
オプションのクライアント構成ファイルは、サーバー・パラメータ・ファイルに設定されているクライアント結果キャッシュの初期化パラメータを上書きします。
ノート:
クライアント結果キャッシュ・ラグを設定できるのは、CLIENT_RESULT_CACHE_LAG初期化パラメータと一緒の場合のみです。
関連項目:
-
クライアント構成ファイルに設定可能なパラメータの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください
-
前述のクライアント結果キャッシュの初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください
結果キャッシュ・モードの設定
結果キャッシュ・モードは、どの問合せがサーバーおよびクライアントの結果キャッシュに結果セットを格納する対象になるかを決定するデータベース設定です。問合せがキャッシュの対象である場合、アプリケーションは結果キャッシュを確認し、問合せ結果セットがキャッシュ内に存在するかどうかを調べます。存在する場合、結果キャッシュから結果を直接取得します。存在しない場合、データベースは問合せを実行して結果を出力として戻し、その結果を結果キャッシュに格納します。結果キャッシュは、読取り専用またはほぼ読取り専用のデータベース・オブジェクトの問合せにお薦めします。
結果キャッシュ・モードを設定するには:
-
RESULT_CACHE_MODE初期化パラメータの値を設定し、結果キャッシュの動作を決定します。このパラメータは、インスタンス(
ALTER SYSTEM)、セッション(ALTER SESSION)またはサーバー・パラメータ・ファイルで設定できます。表17-3では、このパラメータの値を説明します。
-
RESULT_CACHE_MAX_TEMPパラメータは、データベースで結果キャッシュに使用される、一時表領域の最大量を制御します。デフォルトは、RESULT_CACHE_MAX_SIZEのデフォルト値または初期化値の10倍です。これは、セッションではなくシステム・レベルでのみ変更できます。また、この値は、
RESULT_CACHE_MAX_TEMP_RESULTよりも小さい値には変更できません。 -
RESULT_CACHE_MAX_TEMP_RESULTパラメータは、キャッシュした1つの問合せ結果で使用できる、一時表領域の最大サイズを制御します。これはRESULT_CACHE_MAX_RESULTと似ています。この値は、RESULT_CACHE_MAX_TEMP_SIZEよりも大きい値には変更できません。デフォルトは、RESULT_CACHE_MAX_TEMP_SIZEのデフォルト値または初期化値の5%です。これは、セッションではなくシステム・レベルでのみ変更できます。
ノート:
/+ result_cache */ヒントが使用されると、result_cache_modeの値がオーバーライドされます。
RESULT_CACHE_MAX_TEMPの値を過度に大きくしないでください。結果キャッシュのために一時領域を大量に割り当てると、一時表領域のサイズが大幅に増加し、ハッシュ結合、ソート、ユーザー作成の一時表などのデータベース操作のための一時領域の量が減少します。
ヒントを使用した結果キャッシュにのみ一時セグメントを使用することをお薦めします。ディスクに一時セグメントを作成すると、変動の多い環境では無視できない追加の書込み操作が行われます。ヒントを使用すると、この機能がデプロイされるのは、計算コストが高く、頻繁に再利用され、ほとんど不変であることが認識されている問合せのみになります。
result_cacheおよび対応するネガティブ(no_result_cache)ヒントは、問合せブロック・レベルです。集合問合せ(union、union-all、minusなど)には、通常、最上位の問合せブロックがあります。任意のブランチ問合せブロック(直接包括する集合問合せブロックなど)で集合問合せを実行するには、scope=currentヒントを使用します。
scope=toplevelを指定すると、ヒントが最上位の問合せブロック(問合せ/ビュー・レベル)に移動します。ビュー内でscope=toplevelが指定されているresult_cacheヒント(実際のスキーマ・レベルのビュー)の場合、ヒントはビューの最上位の問合せブロックに適用され、ビューを起動する実際の問合せの最上位の問合せブロックには適用されません。
例: result_cache_mode=forceを想定し、キャッシュしないunion-all問合せがあるとします。
select /*+ no_result_cache(scope=toplevel) */ * from dual union all
select * from dual;
前述の例では、no_result_cacheヒントはunion-allの任意のブランチにできます。
表17-3 RESULT_CACHE_MODEパラメータの値
| 値 | 説明 |
|---|---|
|
|
問合せヒントまたは表注釈を使用した場合のみ問合せの結果を結果キャッシュに格納できます。これがデフォルトで、推奨値です。 |
|
|
すべての結果が結果キャッシュに格納されます。結果がキャッシュ内に存在しない場合、データベースは問合せを実行して結果をキャッシュに格納します。それ以降は、 ノート: |
|
|
問合せヒントまたは表注釈を使用した場合のみ問合せの結果を結果キャッシュに格納できます。
|
|
|
すべての結果が結果キャッシュに格納されます。ヒントで明示的に禁止されている場合を除き、すべての問合せでディスク上の一時セグメントを利用できます。 |
|
|
ヒントのオプションの
|
ノート:
結果キャッシュが有効化されている場合はデータベースでも、確定的ではないPL/SQLファンクションを呼び出す問合せがキャッシュされます。そのようなファンクションを呼び出すSELECT文をキャッシュする際、結果キャッシュは、PL/SQLファンクションおよびデータベース・オブジェクトに対するデータの依存性を追跡します。ただし、ファンクションが使用するデータが追跡されていない場合(順序、SYSDATE、SYS_CONTEXT、パッケージ変数など)、こうしたファンクションを呼び出す問合せで結果キャッシュを使用すると失効します。この点に関して、結果キャッシュの動作はPL/SQLファンクションのキャッシュと同一です。そのため、結果キャッシュを有効化する際は、パフォーマンスだけでなく、データの精度も常に考慮してください。
結果キャッシュの要件
結果キャッシュを有効化しても、サーバーまたはクライアントの結果キャッシュに特定の結果セットが含まれることは保証されません。結果がキャッシュされるには、次の要件が満たされている必要があります。
読取り一貫性の要件
スナップショットを再利用可能にするには、スナップショットの読取り一貫性を維持する必要があります。結果セットがキャッシュの対象になるには、少なくとも、次の条件のいずれか1つに当てはまる必要があります。
-
結果の構築に使用される読取り一貫性スナップショットで、データの最新のコミット済状態を取得していること。
-
問合せが、フラッシュバック問合せを使用して明示的な時点を示していること。
現在のセッションで、問合せ内にアクティブなトランザクションの参照オブジェクトがある場合、この問合せの結果はキャッシュの対象となりません。
問合せパラメータの要件
キャッシュの結果は、問合せが等価であり、パラメータ値が同じである場合、変数の値とともにパラメータ化されていれば再利用できます。値やバインド変数の名前が異なる場合、キャッシュ・ミスが生じる場合があります。次のいずれかの要素が問合せで使用されている場合、結果はパラメータ化されます。
-
バインド変数
-
SQLファンクション
DBTIMEZONE、SESSIONTIMEZONE、USERENV/SYS_CONTEXT(定数変数を含む)、UIDおよびUSER。 -
NLSパラメータ
結果をキャッシュする問合せの指定
この項では、結果キャッシュの問合せの指定方法を説明しており、内容は次のとおりです。
SQLの結果キャッシュ・ヒントの使用
キャッシュの動作を制御するには、アプリケーション・レベルで結果キャッシュ・ヒントを使用します。SQLの結果キャッシュ・ヒントは、結果キャッシュのモードおよび表注釈よりも優先されます。
関連項目:
RESULT_CACHEおよびNO_RESULT_CACHEヒントの詳細、および結果がディスクにあふれてもよいかどうかを指定する方法については、Oracle Database SQL言語リファレンス
RESULT_CACHEヒントの使用
結果キャッシュ・モードがMANUALの場合、/*+ RESULT_CACHE */ヒントは、問合せブロックの結果をキャッシュに格納し、キャッシュされた結果を今後の実行で使用するようデータベースに指示します。
例17-3では、RESULT_CACHEヒントを使用する問合せを示します。
例17-3 RESULT_CACHEヒントの使用
SELECT /*+ RESULT_CACHE (TEMP=true) */ prod_id, SUM(amount_sold) FROM sales GROUP BY prod_id ORDER BY prod_id;
この例では、その問合せで、sales表の問合せについて行をキャッシュするようデータベースに指示し、ディスク上の一時表領域へのその結果の格納をデータベースに許可します。
NO_RESULT_CACHEヒントの使用
/*+ NO_RESULT_CACHE */ヒントは、データベースがサーバーまたはクライアントの結果キャッシュに結果をキャッシュしないように指示します。
例17-4では、NO_RESULT_CACHEヒントを使用する問合せを示します。
例17-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;
この例において、view1のSELECT文は外側のブロックで、employeesのSELECT文は内側のブロックです。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結果キャッシュ・ヒントより低いため、問合せレベルでヒントを使用することにより、表およびセッションの設定を上書きできます。
表17-4では、RESULT_CACHE表注釈のための有効な値を示します。
表17-4 RESULT_CACHE表注釈の値
| 値 | 説明 |
|---|---|
|
|
問合せの1つ以上の表が |
|
|
問合せのすべての表が |
DEFAULT表注釈の使用
DEFAULT表注釈を使用すると、データベースによる表レベルの結果のキャッシュが行われません。
例17-5では、DEFAULT表注釈を使用して表salesおよびこの表の問合せを作成する、CREATE TABLE文を示します。
例17-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表の問合せの結果は、表注釈があるためにキャッシュの対象とみなされません。
FORCE表注釈の使用
FORCE表注釈を使用すると、データベースでは、表レベルで結果がキャッシュされます。
例17-5で作成されたsales表を使用し、この表の結果キャッシュを強制適用することに決めた場合は、FORCE表注釈の使用によってそれを実行できます。
例17-6では、sales表に対するFORCE表注釈を使用する、ALTER TABLE文を示します。
例17-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回かぎりの問合せで多くの行を戻します。この問合せではヒントを使用して、結果がキャッシュされないようにしています。
結果キャッシュの監視
結果キャッシュは、キャッシュに値しないオブジェクトの自動除外(ブロック・リスト)によって改善されます。ora.initパラメータRESULT_CACHE_AUTO_BLOCKLISTで有効にすると、バックグラウンド・アクション・グループが定期的に実行されてホット表が検索され、自動ブロック・リストの候補になります。
表がホット表と見なされ、ブロック・リストに登録されている理由を確認するには、ビューV$SQLとそのRESULT_CACHE_REJECTION_REASON列を使用して、オブジェクトのrejection reason codeを確認します。
サーバーおよびクライアントの結果キャッシュに関する情報を表示するには、関連するデータベース・ビューおよび表を問い合せます。
表17-5では、結果キャッシュのモニタリングに最も役に立つビューと表を示します。
表17-5 結果キャッシュに関する情報を含むビューおよび表
| ビュー/表 | 説明 |
|---|---|
|
|
サーバーの結果キャッシュの様々な設定とメモリー使用量の統計のリスト。 |
|
|
サーバーの結果キャッシュのすべてのメモリー・ブロックとそれに対応する統計のリスト。 |
|
|
結果がその属性とともにサーバーの結果キャッシュ内にあるすべてのオブジェクトのリスト。 23aiでは、 |
|
|
サーバー結果キャッシュ内の結果とこれらの結果の依存性間における依存関係の詳細のリスト。 |
|
|
|
|
|
OCIクライアント・プロセスから取得されたクライアントの結果キャッシュのキャッシュ設定とメモリー使用量の統計を格納します。この統計表には、結果キャッシュを使用する各クライアント・プロセスのエントリが含まれます。クライアント・プロセスの終了後、エントリはこの表から削除されます。クライアント表には、 |
|
|
表の結果キャッシュ・モードの注釈を示す |
関連項目:
これらのビューおよび表の詳細は、『Oracle Databaseリファレンス』を参照してください。
ブロック・リストの理由
表17-6 結果キャッシュ拒否理由コード
| コード | 結果キャッシュ拒否の理由 | 推奨修正作業 |
|---|---|---|
|
|
成功 |
該当なし |
|
|
結果サイズがインメモリーの結果当たりの制限を超えています |
|
|
|
結果サイズがディスクの結果ごとの制限を超えています |
|
|
|
エンキューを取得できません |
システムが使用中です。後で再試行してください。 |
|
|
参照オブジェクトのDMLロックを取得できません |
システムが使用中です。後で再試行してください。 |
|
|
参照オブジェクトの行キャッシュ・ロックを取得できません |
システムが使用中です。後で再試行してください。 |
|
|
メモリーを割当てできません |
システムが使用中です。後で再試行してください。 |
|
|
問合せの結果キャッシュIDがブロックリストされています |
|
|
|
問合せで参照されているオブジェクトがブロックリストされています |
|
|
|
結果キャッシュはバイパスされます |
結果キャッシュは、 |
|
|
結果キャッシュが破損しています |
|
|
|
Oracle RACでRCBGプロセスが停止しています |
Oracle RACインスタンスの再起動 |
|
|
問合せは一部のみ実行されました |
カーソルは完全に実行されます。カーソルがPL/SQLの一部として実行されている場合は、 |
|
|
RCBGプロセスが停止しているため、一時領域を割り当てることができません |
Oracle RACインスタンスの再起動 |
|
|
不明な理由 |
不明 |
結果キャッシュの例
次の例に、サーバー結果キャッシュの統計を監視するための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があります。
クライアントのキャッシュを実行しているセッションのクライアント接続情報を取得するには:
-
CLIENT_RESULT_CACHE_STATS$表のCACHE_ID列に対応するGV$SESSION_CONNECT_INFOビューのCLIENT_REGID列からセッションIDを取得します。 -
GV$SESSION_CONNECT_INFOおよびGV$SESSIONビューで関連する列を問い合せます。
サーバーとクライアントのどちらの結果キャッシュ統計の場合も、結果キャッシュ用に最適化されているデータベースでは、Create Count FailureおよびDelete Count Valid統計の値が比較的小さく、Find Count統計の値が比較的大きくなります。
