4

私の PL/SQL には、バインド変数を使用したこの大きな動的 SQL があります。DBMS_SQL パッケージを使用して、生成されたクエリをバインドおよび実行します。

特定の基準に基づいて、WHERE 節が動的 SQL に追加されます。「in」または「=」を使用してバインド変数に一致させると、すべて正常に機能し、結果が非​​常に高速に返されます。

例:

(servedparty = :bv_ or servedpartyimsi = :bv_)

ただし、次のことを行うと:

(servedpartyimei like :bv_)

12345679890% のような値を指定すると、クエリに非常に長い時間がかかります。

私もこのようなことを試しました

(servedpartyimei like :bv_||'%')

次に、「%」なしで値を指定しますが、同じ結果が得られます

バインド変数を使用せずにクエリを実行し、ハードコードされた値を入力すると、結果もすぐに返されます。

ここで何か間違ったことをしていますか?LIKE 演算子のように変数をバインドしないでください。何か案は?

ありがとうございました。

4

3 に答える 3

5

あなたは Oracle のバグ 9197434 (DBMS_SQL を使用しているときに BIND PEEKING NOT HAPPENING) に苦しんでいると思います。

私の知る限り、それは修正されていません。

バインド変数のピークの利点がなければ、Oracle は条件の右側にどのような値があるかわかりませんLIKE。たとえば、「%」だけでもかまいません。LIKEそのため、Oracle では、典型的なバインド変数の値が何行になるかを想定しています。これらの仮定はかなり保守的であり、Oracle を必要な高速プラン (インデックスを使用する可能性が高い) から、取得する低速プラン (ハッシュ結合を使用する可能性が高い) に強制する可能性があります。

EXECUTE IMMEDIATE可能であれば、このバグの影響を受けないネイティブの動的 SQL (つまり、) を使用することをお勧めします。それ以外の場合は、SQL を HINT する必要がある場合があります。

于 2016-11-17T18:26:36.967 に答える