DB2中exists与in的效率对比 — 5秒与21分钟的差距

本文通过实际案例对比了DB2中exists和in子查询的效率,一个查询耗时21分钟,而替换后仅用5秒。强调在SQL优化中应优先考虑使用exists代替in。

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

在SQL查询优化中,无论是ORACLE,SQL Server,还是DB2,或者其他数据库产品,都有这样一条优化规则:尽量使用exists去替代查询中的in。

但是关于他们之间的查询效率,并没有给出太多的实际查询对比,都只是看书上写,或者听“牛人”说,就信以为真了;

那么他们之间的效率差距到底有多大呢?我们来看下吧!

前几天一同事,需要找些数据,然后自己尝试写了这个查询语句,写了一会,写不下去了,然后向我“求救”。

她的需求是这样的:

1. 查找这样的卡号,卡号对应的账户,账户状态正常(为'0'),账户扩展标志前5为也正常('00000');

2. 卡号为已经领取的卡(为'1');

3. 开卡机构所属的城市代码不为'790'。

这个需求中,涉及到4张表,屏蔽写信息:

卡管理物理文件(表):(Key—卡号,存储卡号,以及卡的各种状态)(as400上的物理文件,相当于DB2中的表)

卡号账号对照表:(Key—账号,通过卡号,取到对应的账号,同时存储卡号和账号)

活期存款帐户动态表: (Key—客户号,存储账户信息,包括账户状态,账号;账号与卡号账号对照表关联)

网点(营业机构)信息 表:(Key—网点,存储网点信息,开卡机构与卡管理表关联)

我们先将上面的需求分解,不管多么复杂的需求,分解之后,都变得简单,下面的查询中屏蔽了一些敏感信息;

开卡机构所属的城市代码不为'790':

select e.网点                       
  from 网点信息表 e                  
 where e.城市代码 <> '790'

账户状态正常,账户扩展标志前5位为'00000':

select a.卡号 crdno            
  from 卡号账号对照表 a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值