“NOT IN”比<>?慢得多吗?

时间:2017-08-29 15:45:44

标签: java sql spring oracle jdbc

我有一个相当大的查询,我最近添加了一个新条件,我检查字段是否不等于某个值。我会使用不等于条件<>但我希望将其设置为处理多个值,以防将来添加更多值。因此,为了简单起见,您可以将更大的查询视为以下较小的查询:

SELECT * FROM FOO WHERE NVL(BAR, 1) NOT IN (2)

当我运行查询时,它又为我的执行时间增加了一分钟。没有此条件的原始查询将在几毫秒内返回。所以我把条件调整为这样:

SELECT * FROM FOO WHERE NVL(BAR, 1) = 1

我也尝试了这个

SELECT * FROM FOO WHERE NVL(BAR, 1) <> 2

这两个查询都会在所需的几毫秒内返回。但为什么使用 NOT IN(2)比其他方法慢得多?这对我没用。

注意:字段栏有很多可能的空值,并且条形列未编入索引。

更新

好吧,我刚刚意识到我遗漏了一个非常重要的细节。只有在通过Java运行时才会出现此问题。所以我有一个包含查询的String,我使用

运行它
org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate

直接在SqlDeveloper上运行查询时,我没有看到问题。

1 个答案:

答案 0 :(得分:2)

在某些情况下,查询优化器无法以高效的方式管理,因为不存在左连接或不存在,因此完全扫描和检查匹配会生成慢查询

假设您在BAR列上有适当的索引 你可以尝试避免使用nvl而不是

 SELECT * 
 FROM FOO 
 WHERE BAR NOT IN ( 2 )
 AND BAR IS NOT NULL