共计 912 个字符,预计需要花费 3 分钟才能阅读完成。
Oracle 查询优化之 is null 和 is not null 优化
最近工作的时候遇到了比较大的数据查询,自己的 sql 在数据量小的时候没问题,在数据量达到 300W 的时候特别慢,只有自己优化 sql 了,以前没有优化过,所以记录下来自己的优化过程,本次是关于 is null 和 is not null 的优化。所用环境 0racle11g
现有 a 表,a 表中有字段 b,我想查出 a 表中的 b 字段 is null 的数据。
select * from a where b is null
我在 b 字段上建立的索引,但是当条件是 is null 和 is not null 时,执行计划并不会走索引而是全表扫描。此时 a 表中的数据有 310w 条记录,执行这段查询花费时间约为 0.526 秒
优化:
- 通过函数索引:通过 nvl(b,c) 将为空的字段转为不为空的 c 值,这里要确保数据中是不会出现 c 值的。再在函数 nvl(b,c) 上建立函数索引
select * from a where nvl(b,c)=c
此时花费时间约为 0.01 秒。
当条件为 is not null 时同理可以用 nvl(b,c)<>c 来代替
Oracle 查询优化之子查询条件优化
环境:oracle 11g
现有 a 表与 b 表通过 a01 字段关联,要查询出 a 表的数据在 b 表没有数据的数据;sql 如下
select count(1) from (select a.*,(select count(1) from b where b.a01=a.a01) as flag from a) where flag=0
因为 flag 是虚拟字段没有走不了索引导致这条 sql 执行起来特别慢 310W 条数据查总数花费 2 秒左右。
利用 not exists 优化 sql 如下
select count(1) from a where not exists(select 1 from b where a.a01=b.b01)
利用 not exists 走索引,执行花费时间大约为 0.2 秒
更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-08/146346.htm