工作中遇到的sql优化中的and和or

本文探讨了SQL查询中AND与OR运算符对查询性能的影响,通过具体案例比较了两种查询方式的执行计划,揭示了如何避免笛卡尔积提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先来列举两个sql

select *
  from am_base_info a, am_talent_info t
 where a.id_num = t.id_num
   and t.talent_level = '1'
   and (t.highend_type = '1' or t.highend_type = '3' or
       t.highend_type = '4')
   or a.region_code in (110001)

通过oracle中的explain查看执行计划

通过执行计划我们可以看到,是通过扫描两个表然后使用笛卡尔积,最后再根据其他条件进行查询合并,这就相当耗费时间了,这里主要是在于最后一个or,个人理解相当于查询结果和and查询的结果合并

那么我们再来看另一个查询

select *
  from am_base_info a, am_talent_info t
 where a.id_num = t.id_num
   and t.talent_level = '1'
   and (t.highend_type = '1' or t.highend_type = '3' or
       t.highend_type = '4')
   and (a.region_code in (110001))

这个结果和上面的对比一下就能看到  我们只查询了次循环,结果就出来了,而没有上面的笛卡尔积,为什么呢?这是因为最后一个and中,把or给抛弃掉了,就是说我们在上面的and的查询结果集,判断符合最后一个and的结果,数据就可以出来了,而不需要再次扫描,合并结果集

参考:链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值