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);
--直接比较大小,暗含了 IS NOT NULL
select*from tab_i t where t.col_x>1;
  1. 比较长度
--当t.col_x的长度总是大于1时
select*from tab_i t where 2<=length(nvl(t.col_x,1));
--因为length函数的参数为空时,其结果为空,因而不能直接使用length函数
  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值