“不存在”和“不存在”,哪一个表现更好?

时间:2012-10-21 11:29:19

标签: sql oracle

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中更好?

3 个答案:

答案 0 :(得分:7)

使用NOT EXISTS

目前执行计划可能相同,但如果将来某一列更改为允许NULL ,NOT IN版本将需要做更多工作。

关于NOT EXISTS和NOT IN的最重要的注意事项是,与EXISTS和IN不同,它们在所有情况下都不相同。具体来说,当涉及NULL时,它们将返回不同的结果。完全具体,当子查询返回一个null时,NOT IN将不匹配任何行。

答案 1 :(得分:2)

[NOT] IN[NOT] EXISTS运算符的处理方式不同。 [NOT] IN的处理方式更像是一个连接,而[NOT] EXISTS的处理方式更像是一个IF条件的循环。当然,选择一个在另一个上取决于一种情况:驱动和驱动查询返回的数据量。在[NOT] IN运算符内部查询的情况下(..where id in (select id from table ))是驱动查询,而在[NOT] EXISTS的情况下,外部查询是驱动查询。所以如果子查询(内部查询)返回由于子查询中的表包含少量行或者应用于子查询[NOT] IN运算符的密集过滤可能会提供更好的性能。如果子查询返回大量数据,则会有少量数据数据或主要过滤发生在外部查询[NOT] EXISTS运算符中是可取的。

答案 2 :(得分:1)

他们都做了一个子查询。更快的是:

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