Result Cacheの動作原理と活用方法
目次[非表示]
- 1.概要
- 2.RESULT CACHE QUERYの動作原理
- 3.RESULT CACHE機能を活用する
- 4.RESULT CACHEを使用する際の考慮事項
- 4.1.DMLを使用する際の考慮事項
- 4.2.BINDを使用する際の考慮事項
- 4.3.結論
概要
ORACLE DBMSを使用するシステムでは、QUERYパフォーマンスは何よりも重要な要素の1つであり、そのパフォーマンスと直接関連するのがI / Oです。
多くの件数をACCESS しなければ、必要な結果値を得ることができないQUERY を実行すると、BLOCK I/Oが多く発生することになります。 このため、QUERYのパフォーマンスは悪いです。
コードテーブルのように少ないデータを同時に多くのユーザーが照会する場合は、BUFFER CACHEで希望のBLOCKを見つけて結果を送信しますが、同時に多くのユーザーが使用するためHOT BLOCKになり、ORACLE待機イベントが発生し、速いパフォーマンスを期待することは難しいです。
I / Oに応じてQUERYのパフォーマンスが左右されるため、I / Oを最小限にし、QUERYを実行するとパフォーマンスが向上します。
ORACLE 11GでI/Oの改善のために実装した機能がRESULT CACHE機能です。
RESULT CACHE は SHARED POOL で RESULT CACHE MEMORY と呼ばれる領域に SQL とPL/SQL FUNCTIONの結果を保存し、以降同じQUERY照会時にRESULT CACHEに格納されているQUERY結果値をそのまま活用する機能です。
繰り返し同じ結果値を照会するQUERYで使用され、多くのデータを処理して少ない結果件数を見たい場合にBLOCK I/Oを発生させずに結果を送信するため、照会パフォーマンスにおいて非常に速い結果が得られます。
これから、RESULT CACHE QUERYの動作原理と設定方法を知り、機能の活用について学びましょう。
RESULT CACHE QUERYの動作原理
通常、QUERYが実行され、BUFFER CACHEに目的のブロックがある場合は、要求されたセッションにブロックを送信します。
BUFFER CACHE領域に存在しない場合は、DISK I / Oが発生した後にBUFFER CACHEにBLOCKを置き、要求されたセッションに結果を送信します。
RESULT CACHE機能は一般的なQUERY動作方式と同じですが、結果の値をCACHINGするという点が異なります。
RESULT CACHE QUERY 最初の実行。
- RESULT CACHE QUERYが実行されると、最初にSHARED POOL領域のRESULTCACHE メモリーでOBJECT の CACHING かどうかを確認する。
- OBJECTがCACHINGされていない場合は、BUFFER CACHEでBLOCKを探します。
- BUFFER CACHE に希望の BLOCK が存在しない場合は DISK から BLOCK を読み込みBUFFER CACHEに送信します。
- その結果、値をQUERYしたセッションに送信する
- 最後に、RESULT CACHE領域にQUERY結果値を格納します。
RESULT CACHE QUERY 繰り返し実行.
- RESULT CACHE QUERYが実行されると、最初にSHARED POOL領域のRESULTCACHE メモリーで OBJECT の CACHING かどうかを確認します。
- CACHINGされた情報が存在すれば、I/Oを発生させずにCACHINGされた結果値を要求したセッションに送信します。
RESULT CACHE機能の設定と終了
RESULT CACHE機能の設定
PARAMETER設定でRESULT CACHE機能を使用できます。
セットアップに必要な主要PARAMETERを見てみましょう。
RESULT_CACHE_MODE
RESULT_CACHE_MODE PARAMETERの値に応じて2つのMODEの設定が可能です。
MANUALの場合は、SQLごとに/+ RESULT_CACHE */ HINT を与え、
RESULT CACHE 機能が使用可能で FORCE の場合、すべての SQL が RESULT CACHE の
対象となります。
ただし、/+ NO_ RESULT_CACHE */ HINT を除く。
RESULT_CACHE_MODE PARAMETERのDEFAULT値はMANUALです。
RESULT_CACHE_MAX_SIZE
RESULT CACHE機能を使用するには、RESULT_CACHE_MAX_SIZE値も明示的に指定されていますあるべきです。
このPARAMETERの最大値はSHARED POOLの最大75%まで設定できます。
RESULT_CACHE_MAX_RESULT
1つのSQLに結果セットのキャッシュ領域全体で最大割り当て可能なメモリサイズ。
DEFAULT値は5%です。
RESULT_CACHE_REMOTE_EXPIRATION
REMOTE DATABASE OBJECT の保管周期を時間(分)指定が可能で、DEFAULT値は0です。
The default is 0 which means that resultsets dependant on remote OBJECT
RESULT CACHE機能を終了する
RESULT CACHE機能を取り消す方法には、特定のINSTANCEがRESULT CACHE機能を使用できないように設定する方法とRESULT CACHE機能は使用可能ですが、CACHEでOBJECTを解除する2つの方法があります。
INSTANCEがRESULT CACHE機能を使用したくない場合は、RESULT_CACHE_MODE値を0の値に設定してINSTANCEを再起動するだけです。
RESULT CACHE機能は使用可能ですが、CACHINGされているOBJECTを取り消す方法は、RESULT CACHEパッケージを利用して取り消すことができます。
CACHEで終了する方法については、例を見てみましょう。
CACHINGされたOBJECTを取り消す方法
RESULT CACHE 機能を使用して CACHING された複数の OBJECT のうち、特定の OBJECT のみCACHEで取り消すには、DBMS_RESULT_CACHE.INVALIDATEパッケージを使用して取り消すことができます。
RESULT CACHE機能を活用する
過去の顧客会社の例を見ると、オンライン時に商品について実績を見る業務があった。
業績表は1年間保管され、NON PARTITIONされた表が12個存在しています。
特定の月に該当するパフォーマンスを表示するには、そのテーブルにすべてのデータを読み込む必要があります。
そうなるとI/Oが多く発生し、速い性能が期待できません。
そこで毎日夜間バッチが実行され、前日基準で実績集計テーブルを更新していました。
多くの改善の効果がありますが、まだ読み取るべきデータが多いため、多くのブロックI/Oが発生しています。
ここで、各月に対応する実績照会をRESULT CACHE機能を使用する場合、多くのパフォーマンス改善があります。
特定の月に対応するパフォーマンステストデータを生成して、RESULT CACHE機能を活用してみます。
テーブル生成スクリプト
実施結果を見ると、38,670個のBLOCK I/Oが発生しています。
RESULT CACHE機能を使用してテストをやり直してください。
RESULT CACHE機能を使用した場合(O)(最初の実行)
行われた結果、依然として38,670個のBLOCK I / Oが発生しています。
最初のQUERY実行時にCACHINGされた領域にOBJECTが存在しなかったからです。 VIEWを見ると、CACHEエリアに登録されていることがわかります。
CACHINGされたOBJECTビュー
これでCACHE登録になっていることを確認したので、もう一度やってみよう。
RESULT CACHE機能を使用した場合(O)(繰り返し実行)
実行計画を見ると、I / Oはまったく発生しませんせした。
I / Oがまったく発生しないため、SQLを繰り返し実行する場合でも性能を向上させてくれます。
ここでRESULT CACHEというOPERATIONを見ることができます。
結果の値がCACHINGされたのです。
INLINE VIEWやWITHステートメントなどのクエリでもRESULT CACHE機能を使用できます。
独立してQUERYブロックにCACHINGが可能だからです。
テストを通し学習しましょう。
テーブル生成スクリプト
[DDLの実行]
INLINE VIEW と WITH 文の使用例
RESULT CACHEを使用する際の考慮事項
DMLを使用する際の考慮事項
CACHINGされたOBJECTにDML(変更)が発生した場合、変更された時点でRESULT CACHE機能は無効になります。
その理由は、CACHINGされたOBJECTが変更された場合、QUERYの結果値に対する整合性を保証できないためです。
したがって、DMLが多く発生するOBJECTはRESULT CACHE機能を使用しないことをお勧めします。
BINDを使用する際の考慮事項
BIND変数の変更が多いQUERYに対しても非効率が発生します。
以下のテスト結果を見るとBIND変数の値に応じて独立してCACHINGされることがわかります。
そのため、BIND変数が増えると、特定のQUERYがCACHEの領域をすべて使用し、CACHEしたいそれぞれが他のクエリによってCACHEの登録と失効が頻繁に発生し、CACHEの効率が低下します。
同じQUERYでBIND変数の値が異なる場合
特定のOBJECTを使用する際の考慮事項
以下は、クエリ結果セットをCACHINGできない場合です。
l 一時表または DICTIONARY OBJECT (DBA_, V$_, GV$_* など) 参照時
シーケンスCURRVALとNEXTVAL COLUMNを呼び出す場合
l QUERY で SQL 関数を使用する場合- CURRENT_TIMESTAMP、LOCAL_TIMESTAMP、
SYS_GUID、SYSDATE、SYSTIMESTAMPなど
結論
既存のQUERYは、I / Oが発生しなければ結果セットを知ることができません。 多くのBLOCKでも、多くのセッションが同時に同じBLOCKを使用する場合、WAIT EVENTが発生します。 これは良い性能を期待するのが難しいが、RESULT CACHE機能を使用すると、I/Oをまったく発生しないという部分において、大幅な性能改善の効果があります。 しかし、その機能の長所と短所をよく知って使用しなければ、システムを安定して使用できるはずです。 また、運用しているシステムを見ると、RESULT CACHE機能を使用できる部分があるでしょう。 この機能を活用してI / O性能をさらに向上させることは、より安定化されて最適化されたシステムに発展することになるでしょう。