私は最近、フィールドがいくつかの値と等しくないかどうかを確認する場所に新しい条件を追加したかなり大きなクエリを持っています。私は等しくない条件<を使用していたでしょうが、将来もっと多くの値が追加された場合に複数の値を扱うように設定したかったのです。だから、あなたは、次の小さなクエリのように見える大きなクエリを考えることができ、物事をシンプルに保つために:私は、クエリを実行したとき"NOT IN"は<>よりもはるかに遅いですか?
SELECT * FROM FOO WHERE NVL(BAR, 1) NOT IN (2)
、それは私の実行時間に追加の1分を追加しました。この条件のない元のクエリは、数ミリ秒で戻ります。だから私はこのように条件を微調整:
SELECT * FROM FOO WHERE NVL(BAR, 1) = 1
私もこの
SELECT * FROM FOO WHERE NVL(BAR, 1) <> 2
でそれを試してみたそして、これらのクエリの両方が必要な数ミリ秒で返します。しかし、なぜ使用して(2)他のアプローチよりもはるかに遅いですか?それは私には意味がありません。
注:フィールドバーには多くのnull値があり、バー列にはインデックスが作成されません。
UPDATE:
オーケー、私はちょうど私が非常に重要なディテールを残し実現。この問題は、Javaで実行された場合にのみ発生します。だから私は、クエリを含む文字列を持っていると私はそれが私がのsqldeveloper上で直接クエリを実行すると、私は、問題が表示されない
org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
を使用して実行します。クエリオプティマイザは、あなたが適切なインデックスを上持っていると仮定すると、スロークエリ
を生成するヌル参加したりないので、フルスキャンを存在と一致するかどうかを確認残さないようでefficentな方法で管理することができないいくつかのケースで
にNVLとないの組み合わせを回避しようとすることができますが、それらの両方のための実行計画で見たことがありますか?おそらく、それは 'NOT IN'のために悪い計画を使用しようとしています – Siyual
これはどんなスキーマが動作していますか?インデックスにはどのようなインデックスがありますか? – tadman
ある構成が別の構成よりも遅い場合はありません。一部の構成ではオプティマイザが制限され、異なる実行計画が作成される可能性があります。 Oracleの一部のバージョンでは、これを回避するいくつかの癖があります。おそらく計画はあなたの2つのケースで異なってくるでしょう。 –