2017-08-06 5 views
0

INおよびNOT INの代わりにEXISTSおよびNOT EXISTSを使用すると、問合せのパフォーマンスが向上することがわかりましたが、 NOT INISとは対照的にNOT INをOUTER JOINに置き換えますか?NOT INをOracle Database 12cのNOT EXISTSおよびOUTER JOINに置き換える

たとえば、次のクエリは、PCという別のテーブルにないすべてのモデルをPRODUCTテーブルから選択します。記録のために、製品やPCのテーブルにはモデル値がnullではない:

select model 
from product 
where not exists(
select * 
from pc 
where product.model = pc.model); 

次OUTER JOINを同じ結果が表示されます。これらは同じ値を返すの両方として

select product.model 
from product left join pc 
on pc.model = product.model 
where pc.model is null; 

は見て、どのオプションを使用してクエリのパフォーマンスを改善する必要がありますか?

+1

2つは同じである必要があります。オラクルは最適なオプティマイザを備えており、これらの両方が半アンチ・ジョインの表現方法です。 –

+1

"INの代わりにEXISTSを使用し、NOT INISを使用するとクエリのパフォーマンスが向上することを理解しています。"ある場合には。他のケースでは、INまたはNOT INがより良いパフォーマンスを示します。パフォーマンスは、駆動クエリとサブクエリの相対的なサイズに依存します。 – APC

答えて

1

クエリプランが表示されます。それはデータと表に依存します。 OUTER JOINの場合と存在しない場合は同じです。

ただし、あなたの最初の文章では、NOT INとNOT EXISTSは、モデルでNULLが受け入れられた場合、同じではありません。この場合、modelはnullにはなれないと言われます。だから、とにかく同じプランを持っているかもしれません。しかし、この前提を立てるとき、データベースには、単にNULLではないことを通知する必要があります(NOT NULLを使用)。そうしなければ、実際のデータに応じて異なるパフォーマンスをもたらすかもしれない各クエリに対して異なる計画を立てます。これは一般に真であり、特にNULLをインデックス付けしないORACLEでは真です。

チェックアウト説明

+0

カラムがNULLであるかどうかにかかわらず、クエリは同じ結果セットになります。彼らは同じ実行計画を持つ可能性が高い。したがって、それらはまったく同等である可能性が非常に高い。 –

+0

はい、データにnullがなければ結果は同じであることに同意します。しかし、ヌルがあった場合、それらは異なる結果になります。 DBは、NULLがオプションでないことを知る必要があります。そうでないと、EXISTSとINは結果が同じになることがわかっていても同じ計画を生成しません。 – LoztInSpace

+0

'存在しない 'と' LEFT JOIN'/'WHERE IS NULL'はまったく同じです。あなたは 'NOT IN'と' NOT EXISTS'と混同しているかもしれません。 –