2017-08-16 220 views
-2

我需要遷移4百萬條記錄。PLSQL oracle - 更高性能? NVL()還是IS NULL?

在驗證器中,要檢查列是否爲NULL,還有什麼更高性能的?

WHERE name IS NULL; 

WHERE NVL(name,' ') = ' ' 
+0

兩者都是過濾謂詞100毫秒,然而第二個需要額外的函數來調用每一行。 –

+0

請注意,這些過濾器謂詞不是等價的 - 第二個將計算已經是單個空間的名稱''''。 –

+0

另外,我們假設'name'是一個VARCHAR2。 –

回答

0

在我的機器的表3689150行:

create table t234 as 
select editionable as name 
from all_objects 
cross join (
    select 1 from dual 
    connect by level <= 50 
); 
select count(*) from t234; 

    COUNT(*) 
---------- 
    3689150 

第一個是更加更快:

set timing on 
select count(*) from t234 where name is null; 

    COUNT(*) 
---------- 
    1612400 

Elapsed: 00:00:00.094 

select count(*) from t234 where NVL(name,' ') = ' '; 

    COUNT(*) 
---------- 
    1612400 

Elapsed: 00:00:00.203 

第一查詢需要94毫秒,第二個203毫秒,
所以第一個是快超過100% - 你將節省超過使用NOT NULL運算符代替NVL(name,' ') = ' '

+0

謝謝sooo! – Jpdg

+1

這可能是真的;但它可能不是。像這樣的單一時鐘比較遠不足以支持你的結論。無論如何,只需要大約200毫秒的2倍性能差異並不是非常有說服力的(如果你看到10倍的改進,就打電話給我)。嘗試以這兩種順序(A後跟B,B後跟A)運行10,000次,然後查看性能差異是否顯着。另外,還有許多你沒有指定的因素,例如什麼樣的機器在運行,磁盤速度,緩衝區緩存的當前狀態。 –

+0

此外,優化程序基於列的num_nulls統計信息瞭解有多少行爲null,但它不會知道有多少匹配一些任意的'nvl()'表達式。這可能會在涉及連接的更復雜的查詢中發揮作用等。它可能會應用一個經驗法則(例如,_'any功能結果將匹配行的5%),並且您可能很幸運,或者對於生成的連接順序而言不幸。 –