NVL比非空条件更快?

时间:2015-08-19 13:35:09

标签: sql oracle oracle11g

我问自己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);

那么哪一个会更快回来?

2 个答案:

答案 0 :(得分:3)

他们的逻辑不一样。

请考虑从NULL, 0, 1中的TABLEB开始 - NVL版本将其更改为-1, 0, 1
- WHERE IS NOT NULL将其更改为0, 1

这意味着NOT INWHERE NOT NULL中检查的项目较少,这就是为什么它可以更快。

也就是说,使用NOT IN通常不是最快的。两个标准选项是LEFT JOINNOT 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更简单,更清晰。