突然(残念ながら、「突然」がいつだったのかはわかりません。過去のある時点で正常に実行されたことはわかっています)、クエリの1つが実行にミリ秒ではなく7秒以上かかり始めました。DB リンクを介して 1 つのローカル テーブルと 3 つのテーブルにアクセスしています。3 つのリモート テーブルが結合され、そのうちの 1 つがローカル テーブルと結合されます。
ローカル テーブルの where 句は、単独で実行するのに数ミリしかかからず、少数 (多くても 10 または 100) のレコードしか返しません。3 つのリモート テーブルの間には数十万、場合によっては数百万のレコードがあり、それらを適切に結合すると、数万または数十万のレコードが得られます。
ローカル テーブルの各レコードに関連するいくつかのデータを取得できるように、リモート テーブルとのみ結合しています。
しかし、何が起こっているように見えるかというと、Oracle は最初にリモート テーブルを結合し、次にローカル テーブルを最後にその混乱に結合します。特に現在存在するデータセットを考えると、これは常に悪い考えになるため/*+ LEADING(local_tab remote_tab_1) */
、クエリにヒントを追加したところ、ミリ秒単位で返されるようになりました。
BUFFER SORT
説明計画を比較したところ、リモート テーブルの 1 つを除いてほぼ同じです。
オラクルがこれに間違った方法でアプローチする原因は何でしょうか? 指数の問題ですか?何を探すべきですか?