あなたの知らない世界? : Result Cacheが使われてるんです Tweet
Previously Mac De Oracle
なんて書こうとおもったら、もう一ヶ月以上空いてましたw
ブログの記事の書き込みも年度末です。
いろいろ急がないとw
(謎w
という大人の事情はさておき、
一昨年の今頃、
CDBとPDBの間で迷子になりそう PART3 - containers clause - その2
なんてことを書いていました。
単に、Container clauseのことを書いていただけだったのですが、
その中で以下のようなことを書いていました。
"result cacheも使うようなので、そのあたりの待機イベントも多少気にかける必要もでてくるかもしれない。 と、とーくを見ながら..."
と気になった点も書いておきました。。。。。
実はこのあと、
こいつの洗礼を受けたので、忘れないうちにメモがわりに書いておきます。
(12cの機能の一部として実装されているので、いまのところ12cを利用している場合でないと遭遇することはないと思います。)
Container Clauseを利用した場合にかぎらず、以下で取り上げられているようなケースでは
https://blog.dbi-services.com/oracle-12c-cdb-metadata-a-object-links-internals/
https://blog.dbi-services.com/multitenant-internals-object-links-on-fixed-tables/
以下のようなRESULT_CACHEヒントが内部的に付加されて実行されているケースが多々見られます。(内部的に付加されます)
/*+ RESULT_CACHE (SYSOBJ=TRUE SHELFLIFE=30) */
このヒント、見ての通り結果キャッシュに強制的にキャッシュさせるためのヒントです。(見慣れない生存期間が指定されていますが、マニュアルには書かれていません)
https://blog.dbi-services.com/resultcache-hint-expiration-options/
注意しなければいけない点は、
あなたが意図していなくても、
結果キャッシュが利用されてしまう!
というところ。
参考)
15.2.1 サーバー結果キャッシュの構成
https://docs.oracle.com/cd/E49329_01/server.121/b71276/tune_result_cache.htm#CDEJCBII
なお、前述のヒント以外にも内部的に、RESULT_CACHEヒントを利用している機能があることが知られています。(12c)
マニュアルにも記載されていますが、結果キャッシュは共有プール内に確保されます。
”そこ”を”みんなで”共有するわけです。
共有するわけなので、みんなが結果をキャッシュ!!!! となると
結果キャッシュの管理作業も忙しくなっちゃうこともあるよね、と。
その結果は、待機イベントや処理遅いーーーという形で現れてくることになります。(結果キャッシュのサイズが小さすぎたりする影響などもあり)
ただ、今回紹介しているのは、”わたしたち”が意識的に利用しているものではないところが、ポイント。
/*+ RESULT_CACHE (SYSOBJ=TRUE SHELFLIFE=30) */
というヒント、
わたしたちが意図的に付加して、結果をキャッシュしようとしているわけではないので、
そもそも、結果キャッシュのことなんて、Out of 眼中 なのではないでしょうか。
でも、負荷試験してみたり、Oracle Databaseをいじめ倒していると、思わぬところで、以下の待機イベント高すぎて、
latch free (Event class : Others)
enq: RC - Result Cache: Contention (Event class : Application)
びっくり!!
いうことも、なくはないだろうなぁ。と思います。私もそうでしたw
(どちらかというと、Dynamic samplingがらみで発生している場合が多いようです。)
私が出会った
/*+ RESULT_CACHE (SYSOBJ=TRUE SHELFLIFE=30) */
2018/2/10追記
12.1.0.2では以下のヒントが付与されていました。
/*+ RESULT_CACHE (SYSOBJ=TRUE SHELFLIFE=30) */
12.2.0.1では、以下のヒントに変更されたようです。NO_STATEMENT_QUEUINGヒントでパラレル実行時のステートメントキューイング対象にならないようにしているようです。また、RESULT_CACHEヒントのオプションからSHELFFILEが除外されています。いずれにしても結果キャッシュは利用されるので、該当する待機イベントを多くみるようであればこの辺りのSQL文の実行が多くなっていないか観察してみるとよいかもしれません。
/*+ NO_STATEMENT_QUEUING RESULT_CACHE (SYSOBJ=TRUE) */
付きの内部SQLが多すぎて辛いって、ケースは少ないかもしれません。
大切なことは、あなたの意図しないところで、”RESULT CACHE"が使われている!ということを頭の片隅に置いておくこと!
です。
参考)↓↓↓↓↓
https://community.oracle.com/thread/3937748?start=15&tstart=0
| 固定リンク | 0


コメント