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

Replacing NOT IN with NOT EXISTS and an OUTER JOIN in Oracle Database 12c

我知道当我们使用 EXISTS 和 NOT EXISTS 代替 IN 和 NOT IN 时,我们的查询性能会得到提高,但是,当我们用 OUTER JOIN 代替 NOT IN 时,性能会进一步提高,而不是 NOT存在?

例如,以下查询从 PRODUCT table 中选择所有模型,这些模型不在另一个称为 PC 的 table 中。作为记录,PRODUCT 或 PC table 中没有模型值是空的:

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;

鉴于这两个 return 相同的值,我们应该使用哪个选项来更好地提高我们的查询性能?

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

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

查看解释计划