我想知道哪個查詢更快。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表包含成千上萬的記錄。
我想知道哪個查詢更快。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表包含成千上萬的記錄。
你的兩個查詢做了不同的事情。第一個獲取非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
上的索引,那麼第二個將使用該索引,速度會更快。
不要問一個假設的問題,你應該在你的實際數據上運行一些基準。但這裏有一些意見:
您的查詢做不同的事情。您的第一個查詢選擇COMM不爲空的所有記錄。您的第二個查詢選擇所有記錄。
在這兩種情況下,它可能是兩個全表掃描:「記錄的十萬個。」沒有區別。但是,由於它們具有相同的投影和無排序條款,所以執行時間將相同。
除了:
EMP(COMM)
的第一個結果的索引可能會使用一個完整的快速索引掃描, 因爲你只選擇COMM
所以沒有必要去碰的 表。索引讀取會更快,因爲正常的Oracle索引不會索引空值。EMP(NVL(COMM))
上有基於功能的索引, 第二個查詢仍將執行全表掃描,因爲您在投影中選擇COMM
,因此查詢仍需要讀取表。
這兩個語句做不同的事情。您應該運行您想要的查詢,而不僅僅是最快的查詢。 –
lakhs是什麼意思? – BobC
只是一個記錄的十萬個例子 –