2017-08-29 15 views
0

私は最近、フィールドがいくつかの値と等しくないかどうかを確認する場所に新しい条件を追加したかなり大きなクエリを持っています。私は等しくない条件<を使用していたでしょうが、将来もっと多くの値が追加された場合に複数の値を扱うように設定したかったのです。だから、あなたは、次の小さなクエリのように見える大きなクエリを考えることができ、物事をシンプルに保つために:私は、クエリを実行したとき"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な方法で管理することができないいくつかのケースで

+1

にNVLとないの組み合わせを回避しようとすることができますが、それらの両方のための実行計画で見たことがありますか?おそらく、それは 'NOT IN'のために悪い計画を使用しようとしています – Siyual

+0

これはどんなスキーマが動作していますか?インデックスにはどのようなインデックスがありますか? – tadman

+0

ある構成が別の構成よりも遅い場合はありません。一部の構成ではオプティマイザが制限され、異なる実行計画が作成される可能性があります。 Oracleの一部のバージョンでは、これを回避するいくつかの癖があります。おそらく計画はあなたの2つのケースで異なってくるでしょう。 –

答えて

2

BAR列は あなたが

SELECT * 
FROM FOO 
WHERE BAR NOT IN (2) 
AND BAR IS NOT NULL 
+0

バーの列は索引付けされていません。私はちょうどそれを反映するために投稿を更新しました。しかし、応答ありがとう。 –

+0

私は重要な細部を省いたことを知りました。質問の私の更新を見てください。ごめんなさい。 –

+0

IMはjavaフレームワークではありませんが、他の言語でフレームワークを使用します。フレームワークがアクティブレコードなどを使用して効率的でない場合があります。ORM SQLコマンドを直接実行してフレームワークをオーバーヘッドできますか?あなたのフレームワークでも.. – scaisEdge

関連する問題