在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