質問: oracleデータベースで,1度目に問い合わせた場合は数秒で結果が返ってくるのですが、直後に全く同じSQLで問い合わせを行うと、途端に結果を返してくれなくなってしまいます。 SQLや実行計画を記載出来ないのが申し訳ないのですが、以下のような状況です。 * 10個程度テーブルを外部結合 * 多いテーブルでは70万レコード、他は数万レコード * 各テーブルはanalyzeを施した直後 * 実行計画のコストは10000ほど 調べたところ`[alter system flush shared_pool]`で実行計画のキャッシュを消せるとあったため試したところ、その直後はまた結果がすぐ返ってきました。 現在は開発段階なので都度flushしているのですが、それ以外の方法で改善する方法はありませんでしょうか。やはりSQLチューニングが必要でしょうか。 環境については以下のような状況です。 * 仮想マシン上のWindowsサーバ * Oracle 11.2 * 仮装マシンメモリ8GB * その他詳しい設定などは不明(調べ方/注意点がわかりません) 拙い質問ですがよろしくお願い致します. --- **追記** 書き忘れておりましたが、仮想マシンのタスクマネージャを見ていると1回目の結果が返ってくる際にはCPU使用率が上がったりするのですが、2回目以降はCPU使用率が動いているように見えませんでした。 (これは推測が多分に含まれますが。) なお、EnterpriseManagerを監視する権限はありません。(状況を都度聞きに行くことは可能です。) --- **追記2** 1回目の問い合わせと2回目の問い合わせのSQLトレースを取得したところ、 以下のような状態でした。 これは2回目にFetchでつまづいてしまっているということでしょうか。 ``` call count cpu elapsed disk query current rows Parse 1 0.57 0.58 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 1 1.18 1.20 0 249222 0 61 total 3 1.76 1.78 0 249222 0 61 ``` 2回目の問い合わせ後のトレース ``` call count cpu elapsed disk query current rows Parse 2 1.20 1.20 0 0 0 0 Execute 2 0.00 0.00 0 0 0 0 Fetch 2 2723.88 3392.82 45574362 237788264 0 0 total 6 2725.08 3394.02 45574362 237788264 0 0 ```
回答: カーディナリティフィードバックを無効にしてください