3
select objectid
      ,name
      ,address
 from library_t l 
 where not exists (select *
                     from d107 d 
                    where l.objectid = d.objectid
                   )

select objectid
      ,name
      ,address
  from library_t l 
  where l.objectid not in (select objectid 
                             from d107
                          )

両方のobjectid列にインデックスがある場合、どちらがOracleに適していますか?

4

3 に答える 3

11

を使用しNOT EXISTSます。

実行プランは現時点では同じである可能性がありますが、いずれかの列が将来NULLを許可するように変更された場合、NOTINバージョンはさらに作業を行う必要があります。

NOTEXISTSおよびNOTINについて注意する最も重要なことは、EXISTSおよびINとは異なり、すべての場合で同等ではないということです。具体的には、NULLが含まれる場合、異なる結果を返します。具体的には、サブクエリがnullを1つでも返す場合、NOTINはどの行とも一致しません。

于 2012-10-21T11:31:14.113 に答える
3

[NOT] IN[NOT] EXISTS演算子の処理方法は異なります。[NOT] INは結合のように[NOT] EXISTS処理されますが、条件付きのループのように処理されIFます。もちろん、どちらを選択するかは、状況によって異なります。つまり、駆動クエリと駆動クエリが返すデータの量です。[NOT] IN演算子の場合は内部クエリ(..where id in (select id from table ))駆動クエリですが、外部クエリの場合は[NOT] EXISTS駆動クエリです。したがって、サブクエリ(内部クエリ)が少量のデータを返す場合、サブクエリのテーブルには次のものが含まれます。行数が少ない場合、またはサブクエリ演算子に集中的なフィルタリングが適用されている[NOT] IN場合は、パフォーマンスが向上する可能性があります。サブクエリが大量のデータを返す場合、または外部クエリ[NOT] EXISTS演算子でメジャーフィルタリングが行われている場合が望ましいです。

于 2012-10-21T21:05:48.570 に答える
2

どちらもサブクエリを実行します。より速くなります:

select lib.objectid, lib.name, lib.address
from library_t lib
     left outer join d107 dd on lib.objectid = dd.objectid
where dd is null
于 2012-10-21T11:44:23.613 に答える