多少複雑なOracleクエリがあり、完了に約30分かかります。クエリの遅い部分を取り出して個別に実行すると、数秒で終了します。以下は、分離されたクエリのSQLモニターレポートのスクリーンショットです。
以下は、完全なクエリの一部として実行される場合と同じロジックです。
色は両方のスクリーンショットの同じ表に対応しています。遅いクエリの場合、Oracle MERGE JOIN
はに等値条件を持たない2つのテーブル間で実行していますJOIN
。その結果、約1億5,000万の中間行が不必要に処理されます。
クエリヒントまたはリライトを使用してこの問題を回避できますが、この問題を将来回避し、バグレポートをOracleに送信できるように、できるだけ多くの根本原因を理解したいと思います。悪いプランを取得するたびUNPIVOT
に、クエリテキストUNION ALL
内がプラン内に変換されます。さらに調査するために、そのクエリ変換が発生しないようにしたいと思います。この変換の名前を見つけることができませんでした。また、クエリヒントまたはアンダースコアパラメーターを見つけることができませんでした。私は開発サーバーでテストしているので、何でもできます。
私は、クエリ変換を防ぐために行うことができますが何であるUNPIVOT
のはUNION ALL
?Oracle 12.1.0.2を使用しています。
IPの理由で、クエリ、テーブル名、またはデータを共有できません。単純な複製を思い付くことができませんでした。とはいえ、質問に答えるためにその情報が必要な理由は私にはわかりません。以下は、UNPIVOTクエリと、UNION ALLとして実装された同じクエリの例です。