2013-09-25 4 views
5

静的データの場合、Oracle IN句の制限は1000ですが、サブクエリから無制限のデータを受け入れます。どうして?なぜoracle IN句には、静的データの場合に1000の制限があるのですか?

+0

Oracle Mightinessに疑問はありません。一般ユーザーには禁止されています。D Just kidding。あなたはWHERE par_id IN( 'a'、 'b'、...、 'z')またはpar_id IN( 'or'、 'pr' ... 'zd')でオーバーライドすることができます –

+0

これを無効にする方法私はstackexhangeで3または4を見つけました)。しかし、理由は単純にOracleのプリロード、クエリの最大バイトなどの基本的な制約のようになるかもしれません – SriniV

+0

12以上のエントリがある場合は、サブクエリを使用する必要がありますとにかく何らかの並べ替え。 1000は任意の大きな制限です - おそらく既に大きすぎます。 –

答えて

8

これは、任意のexpression list上の制限です:

式のコンマ区切りのリストが何も1000の以上の式を含めることはできません。

なぜ1000ですか?おそらく実装にはある種の制限が必要であり、それはおそらく十分以上のように見えます。数十年前にその制限が設定されていたのは確かであるかもしれませんが、この場合はINがオプティマイザによって複数のORステートメントに変換されるため、制限のパフォーマンス上の理由があります実行計画を見てください)。

とにかくサブクエリとして他のデータから派生することのできない固定値を使って、その近くにいる必要がある合理的なシナリオを思いつくのは苦労します。

logical database limitsと多少関連していると思われます。たとえば、テーブルに1000を超える列を使用することはできません。式リストは挿入文で列と挿入される値の両方をリストするために使用されるので、式リストはそれを照合できなければなりませんが、それを超えなければならない可能性があります。

もちろん...ソフトウェアの内部を見ることなく、あなたは決定的な答えを得ることはまずありません。

+1

列の数と式リスト内の要素の数の間の興味深い関係。これが関連しているとは決して考えなかった。 –

1

これは、リスト内の多数の値を持つINのパフォーマンスが非常に低いためです。これはOR節のショートカットです。データベースレベルでは、エンジンはINをORに変更します。

また、IN句の中でサブクエリを実行しないようにしてください。EXISTSを使用する方がよいでしょう。

+1

'IN'と' EXISTS'は論理的に等価です。それらはOracleオプティマイザによって同じ方法で処理されます。あなたはどちらかを自分の裁量で使うべきです、それはパフォーマンスの観点からは重要ではありません。 –

0

'存在する'を使用してください。 '存在する'を使用してサブクエリを作成することもできます。

関連する問題