UNPIVOTがUNION ALLに変換されるのを防ぐにはどうすればよいですか?


13

多少複雑なOracleクエリがあり、完了に約30分かかります。クエリの遅い部分を取り出して個別に実行すると、数秒で終了します。以下は、分離されたクエリのSQLモニターレポートのスクリーンショットです。

OK

以下は、完全なクエリの一部として実行される場合と同じロジックです。

悪い計画

色は両方のスクリーンショットの同じ表に対応しています。遅いクエリの場合、Oracle MERGE JOINはに等値条件を持たない2つのテーブル間で実行していますJOIN。その結果、約1億5,000万の中間行が不必要に処理されます。

クエリヒントまたはリライトを使用してこの問題を回避できますが、この問題を将来回避し、バグレポートをOracleに送信できるように、できるだけ多くの根本原因を理解したいと思います。悪いプランを取得するたびUNPIVOTに、クエリテキストUNION ALL内がプラン内に変換されます。さらに調査するために、そのクエリ変換が発生しないようにしたいと思います。この変換の名前を見つけることができませんでした。また、クエリヒントまたはアンダースコアパラメーターを見つけることができませんでした。私は開発サーバーでテストしているので、何でもできます。

私は、クエリ変換を防ぐために行うことができますが何であるUNPIVOTのはUNION ALL?Oracle 12.1.0.2を使用しています。

IPの理由で、クエリ、テーブル名、またはデータを共有できません。単純な複製を思い付くことができませんでした。とはいえ、質問に答えるためにその情報が必要な理由は私にはわかりません。以下は、UNPIVOTクエリと、UNION ALLとして実装された同じクエリの例です。


1
あなたの例では、すべてのユニオンが存在するため、表示されます。ユニオンをすべて持たない独自のクエリを実行し、プランを説明してもユニオンがすべて表示されない。では、おそらく、ここで問題を引き起こしているのはピボット解除操作ではなく、クエリですか?
ラジ

@Rajポイントは、問題をさらに絞り込むために、クエリテキストを変更せずにその変換を無効にすることです。
ジョーオブビッシュ

3
私は長年Oracleと協力してきましたが、列/テーブルを置換したクエリまたは少なくとも互換性のある疑似クエリを確認する必要がある場合があります。それなしでは推測し続けることができますが、あなたにも私にも役に立たないのです。
ラジ

回答:


1

次のOracleオプティマイザーのヒントを試してください。

NO_EXPAND

このヒントは、OR展開を無効にします。OR展開は、where句内の結合OR条件またはINリストを、を使用して複合クエリに変換しますunion all

SQLがないため、これは推測ですが、実行可能なオプションのようです。

2番目のオプションとして、開発環境にいるため、Oracleオプティマイザーのヒントを試すことができます。

NO_QUERY_TRANSFORMATION

ただし、このヒントは、オプティマイザーが常に適用できる変換以外に、オプティマイザー実行できるすべてのクエリ変換を無効にます。


ORはUNPIVOTと同じものではありません。UNPIVOTで機能するNO_EXPANDヒントを示す簡単な例を作成できますか?これを試しましたが、うまくいきませんでした。
ジョーオブビッシュ

@JoeObbish-複雑なSQLの縮小版をUNPiVOTで提供できますか?私ができるならあなたを助けたい
...-tale852150

1
@JoeObbish-別の提案で回答を更新しました。お役に立てれば。
tale852150
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.