我理解当我们在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;
看到这两个值都返回相同的值,我们应该使用哪个选项来更好地提高查询的性能?
答案 0 :(得分:1)
查询计划会告诉你。它取决于数据和表格。在OUTER JOIN和NOT EXISTS的情况下,它们是相同的。
但是对于你的开头句,如果在模型上接受NULL,则NOT IN和NOT EXISTS不相同。在这种情况下,您说模型不能为空,因此您可能会发现它们都具有相同的计划。但是,在做出这个假设时,必须告诉数据库不能有空(使用NOT NULL),而不是没有任何空。如果不这样做,它将针对每个查询制定不同的计划,这可能会导致不同的性能,具体取决于您的实际数据。这通常是正确的,对于没有索引NULL的ORACLE尤其如此。
查看EXPLAIN PLAN