在Oracle Database 12c中用NOT EXISTS和OUTER JOIN替换NOT IN

时间:2017-08-06 00:33:59

标签: oracle outer-join not-exists

我理解当我们在IN和NOT IN中使用EXISTS和NOT EXISTS时,我们的查询性能得到了提高,但是,当我们用OUTER JOIN替换NOT IN而不是NOT EXISTS时,性能会进一步提高吗?

例如,以下查询选择PRODUCT表中不在另一个名为PC的表中的所有模型。对于记录,PRODUCT或PC表中的模型值均为空:

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 个答案:

答案 0 :(得分:1)

查询计划会告诉你。它取决于数据和表格。在OUTER JOIN和NOT EXISTS的情况下,它们是相同的。

但是对于你的开头句,如果在模型上接受NULL,则NOT IN和NOT EXISTS不相同。在这种情况下,您说模型不能为空,因此您可能会发现它们都具有相同的计划。但是,在做出这个假设时,必须告诉数据库不能有空(使用NOT NULL),而不是没有任何空。如果不这样做,它将针对每个查询制定不同的计划,这可能会导致不同的性能,具体取决于您的实际数据。这通常是正确的,对于没有索引NULL的ORACLE尤其如此。

查看EXPLAIN PLAN