谈一谈in/exists , not in/not exists

谈一谈in/exists , not in/not exists

这个话题应该很多人写过了,多数是在分析in/哪个写法效率高;not in/not 是否等价等问题。老虎刘这里再补充点内容。

先说说简单的in 和 :

in 和 在目前的主流版本(10g及以上),是等价的。优化器会统一做查询转换。

但是如果屏蔽了某些隐含参数谈一谈in/exists , not in/not exists,还是会不一样,曾经在客户现场遇到一个caseoracle not exists,使用的SQL,优化器没有自动做,性能很差,加了的hint后可以,改成in也可以不用加的hint就能自动做。这种情况比较少见,一般不用考虑。

需要注意的是,下面类似的写法会导致优化器不能做查询转换:

, from t1

where(=’T2′ or (  1 from  t2 where t1.=t2.));

就是 与其他谓词条件之间是OR的关系。这样就只能做操作,数据量大非常影响性能。

这种情况可以考虑使用union all改写SQL来提高性能。

再说说复杂一点的not in 和 not :

首先的结论是:

在两个表的关联字段定义都为not null的情况下,两者的结果集才是想同的,可以等价改写。

如果关联字段定义为null,那么即使没有为null的记录,在没有加is not null谓词条件的情况下,虽然结果集是一样的,但是执行计划是不同的,效率也相差较大。

更要注意的是:如果某个表的关联字段内容是nulloracle not exists,还要看SQL的结果集是不是你要的结果集。

先做个test case:

table (id1 ,name1 (20));

table (id2 ,name2 (20));

into (1,’a1′);

into (2,’b1′);

into (3,’c1′);

into (null,’d1′);

into (2,’b2_1′);

into (2,’b2_2′);

into (3,’c2′);

into (4,’d2′);

into (null,’e2′);

oracle not exists

not 的结果:注意返回了一条关联字段为null的记录

id1,name1  from where not

( 1 from where .id1=.id2 );

结果:

ID1 NAME1

———- ——————–

d1

1 a1

执行计划效率高,不用考虑子查询有空值的情况。建议写法。

not in的结果:因为子查询的结果集中有一条记录是null,则整个查询结果为空(这是否是你想要的结果?)

id1,name1  from

where id1 not in ( id2 from );

no rows

执行计划的join 步骤包含ANTI NA关键字,效率低

not in子查询没有null记录的情况:返回结果比not 时少了一条id1=null的记录

id1,name1  from where id1 not in

( id2 from where id2 is not null);

ID1 NAME1

———- ——————–

1 a1

oracle not exists

执行计划的join 步骤包含ANTI SNA 关键字,效率低

下面sql的结果集与上面一样,但是执行计划却不一样谈一谈in/exists , not in/not exists,下面的执行计划效率高:

id1,name1  from where id1 not in

( id2 from where id2 is not null) and id1 is not null;

ID1 NAME1

———- ——————–

1 a1

执行计划的join 步骤只包含ANTI 关键字,效率高

建议:

如果你的表定义没有做not null的限制,那么建议你在写not in SQL时加两个is not null。

总结:

in 和 是等价的,性能也是一样的,注意避免与其他谓词条件的OR 操作。

not in和not 在关联字段都为not null时才等价(包括性能)。一般情况使用not 比较保险,可以避免not in子查询返回包含null的记录时oracle not exists,整个结果集为空的情况(这种情况一般不是需要的结果),性能也有保障。

如果使用了not in,子查询的关联字段一般加上not null,主查询也加上not null,这样才能保证sql的高性能。

注:以上测试及结论在11.2.0.3版本环境得出。

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » 谈一谈in/exists , not in/not exists

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们