2015-08-19 26 views
0

我在問自己NVL函數是否比where不爲null條件更快。我在谷歌搜索是否有人談論它,但沒有發現任何人在這個問題上作出明確迴應。NVL比不是空條件更快?

所以這裏的情況我有一個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); 

那麼,哪一個將返回得更快?

+3

是否有某些原因導致您無法運行測試併爲自己確定答案..? –

+0

不,我只是想知道是否有一個可能性比另一個更快,或者如果一個總是比另一個更快。 – JoSav

+0

我試過了它似乎是非空條件更快,但我想知道是否有某種方式的NVL功能可以更快。 – JoSav

回答

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 
      ) 
+5

也許值得注意的是,如果'id'可以是'-1',則區別也是很重要的。那麼,這兩種形式是非常非常不同的。我也認爲'where'表單可以通過'nvl()'表單不能的方式來利用索引。 –

+0

ID不能爲-1,這就是我使用它的原因。 – JoSav

0

我做了一個基準非常相似,在這種情況下,原有的查詢和NVL是大約慢47%。但是在實際應用中同意以前的評論它取決於很多方面和IS NULL更簡單和更清晰的條件。