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