我有一个相当大的查询,我最近添加了一个新条件,我检查字段是否不等于某个值。我会使用不等于条件<>但我希望将其设置为处理多个值,以防将来添加更多值。因此,为了简单起见,您可以将更大的查询视为以下较小的查询:
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上运行查询时,我没有看到问题。
答案 0 :(得分:2)
在某些情况下,查询优化器无法以高效的方式管理,因为不存在左连接或不存在,因此完全扫描和检查匹配会生成慢查询
假设您在BAR列上有适当的索引 你可以尝试避免使用nvl而不是
SELECT *
FROM FOO
WHERE BAR NOT IN ( 2 )
AND BAR IS NOT NULL