我问自己NVL功能是否比where not null条件更快。我在谷歌上搜索过是否有人谈论它,但没有发现任何人在这个问题上做出明确答复。
所以这是我有sql请求的情况,我想知道哪个更快。 在这个例子中,我简化了我的查询,只是为了让你知道我想知道什么。
这是使用nvl函数的请求
SELECT TA.MNT FROM TABLEA TA WHERE TA.ID NOT IN(SELECT NVL(TB.ID,-1) FROM TABLEB TB);
这是非空条件
SELECT TA.MNT FROM TABLEA TA WHERE TA.ID NOT IN(SELECT TB.ID FROM TABLEB TB WHERE TB.ID IS NOT NULL);
那么哪一个会更快回来?
答案 0 :(得分:3)
他们的逻辑不一样。
请考虑从NULL, 0, 1
中的TABLEB
开始
- NVL
版本将其更改为-1, 0, 1
- WHERE IS NOT NULL
将其更改为0, 1
。
这意味着NOT IN
在WHERE NOT NULL
中检查的项目较少,这就是为什么它可以更快。
也就是说,使用NOT IN
通常不是最快的。两个标准选项是LEFT JOIN
和NOT EXISTS
。
SELECT
TABLEA.*
FROM
TABLEA
LEFT JOIN
TABLEB
ON TABLEB.ID = TABLEA.ID
WHERE
TABLEB.ID IS NULL
SELECT
TABLEA.*
FROM
TABLEA
WHERE
NOT EXISTS (SELECT *
FROM TABLEB
WHERE TABLEB.ID = TABLEA.ID
)
答案 1 :(得分:0)
我做了一个非常类似于原始查询的基准测试,在那种情况下NVL慢了约47%。但是同意以前在实际应用中的评论它取决于很多方面而且IS NULL更简单,更清晰。