大家好,又见面了,我是你们的朋友全栈君。
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);
--直接比较大小,暗含了 IS NOT NULL
select*from tab_i t where t.col_x>1;
- 比较长度
--当t.col_x的长度总是大于1时
select*from tab_i t where 2<=length(nvl(t.col_x,1));
--因为length函数的参数为空时,其结果为空,因而不能直接使用length函数
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126517.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...