我需要遷移4百萬條記錄。PLSQL oracle - 更高性能? NVL()還是IS NULL?
在驗證器中,要檢查列是否爲NULL,還有什麼更高性能的?
WHERE name IS NULL;
或
WHERE NVL(name,' ') = ' '
我需要遷移4百萬條記錄。PLSQL oracle - 更高性能? NVL()還是IS NULL?
在驗證器中,要檢查列是否爲NULL,還有什麼更高性能的?
WHERE name IS NULL;
或
WHERE NVL(name,' ') = ' '
在我的機器的表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,' ') = ' '
謝謝sooo! – Jpdg
這可能是真的;但它可能不是。像這樣的單一時鐘比較遠不足以支持你的結論。無論如何,只需要大約200毫秒的2倍性能差異並不是非常有說服力的(如果你看到10倍的改進,就打電話給我)。嘗試以這兩種順序(A後跟B,B後跟A)運行10,000次,然後查看性能差異是否顯着。另外,還有許多你沒有指定的因素,例如什麼樣的機器在運行,磁盤速度,緩衝區緩存的當前狀態。 –
此外,優化程序基於列的num_nulls統計信息瞭解有多少行爲null,但它不會知道有多少匹配一些任意的'nvl()'表達式。這可能會在涉及連接的更復雜的查詢中發揮作用等。它可能會應用一個經驗法則(例如,_'any功能結果將匹配行的5%),並且您可能很幸運,或者對於生成的連接順序而言不幸。 –
兩者都是過濾謂詞100毫秒,然而第二個需要額外的函數來調用每一行。 –
請注意,這些過濾器謂詞不是等價的 - 第二個將計算已經是單個空間的名稱''''。 –
另外,我們假設'name'是一個VARCHAR2。 –