2017-03-28 12 views
-3

我想知道哪個查詢更快。ORACLE NOT NULL在帶NVL操作的條款中

例如:1

select comm 
from emp 
where comm is not null; 

例如:2

select comm 
from emp 
where nvl(comm,'0') is not null; 

請考慮EMP表包含成千上萬的記錄。

+2

這兩個語句做不同的事情。您應該運行您想要的查詢,而不僅僅是最快的查詢。 –

+0

lakhs是什麼意思? – BobC

+0

只是一個記錄的十萬個例子 –

回答

1

你的兩個查詢做了不同的事情。第一個獲取非NULL值。第一個拉動一切。

我想你打算:

select comm from emp where comm is not null; 

select comm from emp where nvl(comm, '0') <> '0' 

這些還是做不同的事情,因爲第二也過濾掉「自然」 '0'值。但他們更接近。

第一個比較簡單,使用一個內置的操作符。第二個運行一個函數並使用相同的內置運算符。第一個應該永遠不會比第二個慢 - 只有一個例外。

Oracle允許在表達式上使用索引。如果您碰巧有nvl(comm, '0')上的索引,則大多數值爲'0'您沒有comm上的索引,那麼第二個將使用該索引,速度會更快。

3

不要問一個假設的問題,你應該在你的實際數據上運行一些基準。但這裏有一些意見:

您的查詢做不同的事情。您的第一個查詢選擇COMM不爲空的所有記錄。您的第二個查詢選擇所有記錄。

在這兩種情況下,它可能是兩個全表掃描:「記錄的十萬個。」沒有區別。但是,由於它們具有相同的投影和無排序條款,所以執行時間將相同。

除了:

  1. 呈現的輸出將是不同的,這是因爲第二 結果集可以比第一較大的時間。
  2. 如果在 EMP(COMM)的第一個結果的索引可能會使用一個完整的快速索引掃描, 因爲你只選擇COMM所以沒有必要去碰的 表。索引讀取會更快,因爲正常的Oracle索引不會索引空值。
  3. 即使EMP(NVL(COMM))上有基於功能的索引, 第二個查詢仍將執行全表掃描,因爲您在投影中選擇COMM,因此查詢仍需要讀取表。