oracle優化:IS NULL的優化和IS NOT NULL的優化
阿新 • • 發佈:2018-11-20
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或者比較大小,
這兩種效率一般高於比較長度
優化示例
- 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;
- 比較大小
--當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);
- 比較長度
--當t.col_x的長度總是大於1時
select*from tab_i t where 2<=length(nvl(t.col_x,1));
--因為length函式的引數為空時,其結果為空,因而不能直接使用length函式