- 締切済み
キャッシュを使わずに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の環境がありますので、 それぞれで最適な方法がございましたらご教授ください。 よろしくおねがいします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- SherlockHolmes2
- ベストアンサー率40% (175/429)
1つ確認ですが、SQL-AとSQL-BとSQL-C、それぞれの処理速度を厳密に比較したいという事ですよね? であれば、それぞれのSQLを実行する前に、DBを再起動する必要があると思います。 SQLを実行すれば、どうしてもデータはキャッシュにのってしまいます。 なので、DBを再起動して、完全にまっさらな状態にする必要があります。 「運用上それが出来ない」となれば、その環境と同じ環境を別に用意して、そこでテストを行うしか無いと思います。 ちなみに、No1の回答者さんが示したURLは、OracleBIを使用している場合の説明ですね。
- nora1962
- ベストアンサー率60% (431/717)
「システムのキャッシングの無効化」を行った場合、該当のSQL内でのキャッシングも無効になる影響は考えられませんか。 例えば、インデックスのRANGEスキャンを行う場合、通常ならルートやブランチブロックはキャシュされますが、キャッシングを全面的に無効にするとDISKアクセスが頻発する気がします。
- utun01
- ベストアンサー率40% (110/270)
7.6.1.1 システムのキャッシングの無効化 http://docs.oracle.com/cd/E28389_01/bi.1111/b63029/querycaching.htm#i1018704 この辺は如何でしょうか。 ALTER SYSTEM FLUSH BUFFER_CACHE; が使えない理由が、キャッシュを後で使うから、とかであった場合、 この方法で一時的にキャッシュ無効化⇒後で有効化でいける気がします。