• 締切済み

キャッシュを使わずにSELECTを投げたい

SELECTのSQLのパフォーマンスチューニングを行なっています。 例えば、A,B,Cと3本の候補があってA,B,Cの順に速度を見たいとき B以降はAによるキャッシュを利用して実行するはずなので、 この3つの実行速度がうまく比較できません。 (頻繁に投げられるSQLではないので、アプリ側から投げられるときは キャッシュにのっていない想定です) SQLを投げるたびに ALTER SYSTEM FLUSH BUFFER_CACHE ; でキャッシュをクリアすれば、3つを比較できるのでしょうが、 運用上の問題でそれもできません。 理想としては SELECT /*+ NOT_USE_CACHE*/ … のようにヒント句や alter sessionなどでキャッシュを使わずにSQLを投げたいのですが、 どのようにしたら実現できるでしょうか? 環境は 9iと11gの環境がありますので、 それぞれで最適な方法がございましたらご教授ください。 よろしくおねがいします。

みんなの回答

回答No.3

1つ確認ですが、SQL-AとSQL-BとSQL-C、それぞれの処理速度を厳密に比較したいという事ですよね? であれば、それぞれのSQLを実行する前に、DBを再起動する必要があると思います。 SQLを実行すれば、どうしてもデータはキャッシュにのってしまいます。 なので、DBを再起動して、完全にまっさらな状態にする必要があります。 「運用上それが出来ない」となれば、その環境と同じ環境を別に用意して、そこでテストを行うしか無いと思います。 ちなみに、No1の回答者さんが示したURLは、OracleBIを使用している場合の説明ですね。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

「システムのキャッシングの無効化」を行った場合、該当のSQL内でのキャッシングも無効になる影響は考えられませんか。 例えば、インデックスのRANGEスキャンを行う場合、通常ならルートやブランチブロックはキャシュされますが、キャッシングを全面的に無効にするとDISKアクセスが頻発する気がします。

  • utun01
  • ベストアンサー率40% (110/270)
回答No.1

7.6.1.1 システムのキャッシングの無効化 http://docs.oracle.com/cd/E28389_01/bi.1111/b63029/querycaching.htm#i1018704 この辺は如何でしょうか。 ALTER SYSTEM FLUSH BUFFER_CACHE; が使えない理由が、キャッシュを後で使うから、とかであった場合、 この方法で一時的にキャッシュ無効化⇒後で有効化でいける気がします。

関連するQ&A