阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle查询优化之is null和is not null优化

162次阅读
没有评论

共计 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 秒

优化:

  1. 通过函数索引:通过 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

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计912字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中