1. 程式人生 > >oracle優化:IS NULL的優化和IS NOT NULL的優化

oracle優化:IS NULL的優化和IS NOT NULL的優化

IS NULL的優化

優化方法:
通過nvl(欄位i,j),將欄位i中為空的資料轉化為j,從而正常使用索引.
具體則是將條件 i is null 轉化為 j = nvl(i,j);
資料量較大時轉化is null 在所用oracle版本提升明顯,
注意:使用時必須確保欄位i的資料不包含j!
缺陷:欄位i不能有值為j的資料
另外一種方式是將null包含到索引中

函式介紹:
nvl(a,b,c,…)
當a為空時取b,當b為空取c,以此類推.

優化示例

--使用nvl函式的方式(不用新增索引,推薦)
select*from tab_i t where 1=nvl(t.col_x,1);
--當t.col_x不存在等於1的資料時等價於
--select*from tab_i t where t.col_x is null;
--新增索引的方式
create index idx_col_x on tab_i(decode(col_x,null,1));
select*from tab_i t where decode(t.col_x,null,1)=1;

IS NOT NULL的優化

優化方法
結果集不包含 j = nvl(i,j)即可,方式多樣.
通常情況下可以使用not exists或者比較大小,
這兩種效率一般高於比較長度

優化示例

  1. not exists
select*from tab_i t where not exists 
(select 1 form tab_i i where 1=nvl(i.col_x,1));
--11g版本後not in和not exists趨於相似,也可以用not in
--當t.col_x不存在等於1的資料時等價於
--select*from tab_i t where t.col_x is not null;
  1. 比較大小
--當t.col_x為總是大於1的數值時
select*from tab_i t where 1<nvl(t.col_x,1);
--當t.col_x為總是小於1的數值時
select*from tab_i t where 1>nvl(t.col_x,1);
  1. 比較長度
--當t.col_x的長度總是大於1時
select*from tab_i t where 2<=length(nvl(t.col_x,1));
--因為length函式的引數為空時,其結果為空,因而不能直接使用length函式