如何在Oracle中查询某个字段为null时使用索引

记录目的

在Oracle查询sql中即使某个字段加入索引,在查询字段 is null的情况下,也会索引失效。本文目的是如何在判断字段为空的情况下也使用索引。因实操环境为公司封闭开发环境,无法展示执行计划,具体的需要大家实际操作。

查询sql select * from mobile where phone is null;

下策:使用联合索引

在创建索引时使用联合索引,讲查询字段作为第一个字段,第二个随便加一个字段或者默认值,在数据量少的情况下,此方法有效。在我实验中查询的结果在300条时,会使用索引查询数据,在查询数据量为5w条时,不会使用此索引。

create index mobile_phone_index on mobile(phone,1);
第二个字段可以为某个字段或一个固定的数字,例如1、-1等

建立此索引,查询sql情况下,数量少的情况会此索引 mobile_phone_index 会起作用。若数据量大,第一个字段 null 的量太多的情况下索引将不起作用。

中策:使用函数索引—decode

decode函数只有oracle数据库中有
create index mobile_phone_index on mobile(decode(phone,null,’-1’,’-2’));

此索引decode使用函数解释:当phone字段为null时,此字段为“-1”,其余情况下为“-2”。
注:可以自定义扩展学习decode

此情况下查询sql,一定会使用索引,但查询效率一般,具体可以查看执行计划。

上策:使用位图索引加函数索引组合

简单介绍位图索引,当一个表内数据量很大,但某个字段的只有某几个值,例如性别:男、女(只讨论这2种)。若此字段加普通索引(B+TREE)的情况将存储很大,效率极低,若使用位图索引,将极大的提高效率,存储只有男、女2种,由此就生成了长度为总数量,只包含01的字符串。具体的可以查看此文索引:位图索引理解解释。

创建索引sql
create bitmap index mobile_phone_index on mobile(decode(phone,null,’-1’,’-2’));
此情况下查询sql,会索引的同时,查询效率比中策高,具体大家可以查看执行计划。

尾言

这只是在工作中碰到整理笔记,若存在错误的地方,请大家指正留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值