千家信息网

IN&EXISTS与NOT IN&NOT EXISTS的优化原则是什么

发表于:2024-12-04 作者:千家信息网编辑
千家信息网最后更新 2024年12月04日,本篇文章给大家分享的是有关IN&EXISTS与NOT IN&NOT EXISTS的优化原则是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看
千家信息网最后更新 2024年12月04日IN&EXISTS与NOT IN&NOT EXISTS的优化原则是什么

本篇文章给大家分享的是有关IN&EXISTS与NOT IN&NOT EXISTS的优化原则是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

1. EXISTS的执行流程 select * from t1 where exists ( select null from t2 where y = x ) 可以理解为:复制代码 代码如下: for x in ( select * from t1 ) loop if ( exists ( select null from t2 where y = x.x ) then OUTPUT THE RECORD end if end loop

对于in 和 exists的性能区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。 其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 另外IN时不对NULL进行处理,如: select 1 from dual where null in (0,1,2,null) 结果为空。 2. NOT IN 与NOT EXISTS: NOT EXISTS的执行流程复制代码 代码如下: select ..... from rollup R where not exists ( select 'Found' from title T where R.source_id = T.Title_ID);

可以理解为:复制代码 代码如下: for x in ( select * from rollup ) loop if ( not exists ( that query ) ) then OUTPUT end if; end;

注意:NOT EXISTS 与 NOT IN 不能完全互相替换,看具体的需求。如果选择的列可以为空,则不能被替换。 例如下面语句,看他们的区别: select x,y from t; x y ------ ------ 1 3 3 1 1 2 1 1 3 1 5 select * from t where x not in (select y from t t2 ) no rows select * from t where not exists (select null from t t2 where t2.y=t.x ) x y ------ ------ 5 NULL 所以要具体需求来决定 对于not in 和 not exists的性能区别: not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,并使用anti hash join. 如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null NOT IN 在基于成本的应用中较好 比如:复制代码 代码如下: select ..... from rollup R where not exists ( select 'Found' from title T where R.source_id = T.Title_ID);

改成(佳) select ...... from title T, rollup R where R.source_id = T.Title_id(+) and T.Title_id is null; 或者(佳) sql> select /*+ HASH_AJ */ ... from rollup R where ource_id NOT IN ( select ource_id from title T where ource_id IS NOT NULL ) 注意:上面只是从理论上提出了一些建议,最好的原则是大家在上面的基础上,能够使用执行计划来分析,得出最佳的语句的写法。 '//============================= exists,not exists总结 1 exists SELECT * FROM anken_m WHERE EXISTS( SELECT my_list_temp_m.sales_code FROM my_list_temp_m WHERE my_list_temp_m.sales_code=anken_m.sales_code) 说明: 1) 查询在anken_m表和my_list_temp_m表中都存在的sales_code。 2) sales_code是anken_m的主键,my_list_temp_m的外键。 注意: 1) 外层查询表anken_m是查询的对象。 2) 内层查询表my_list_temp_m是条件对象。 3) 内外层的查询表不能相同。 4) 作为关联条件的anken_m表不需要在内层查询FROM后添加。 5) my_list_temp_m.sales_code=anken_m.sales_code条件的左右顺序不影响查询结果。 2 not exists SELECT * FROM anken_m WHERE NOT EXISTS( SELECT my_list_temp_m.sales_code FROM my_list_temp_m WHERE my_list_temp_m.sales_code=anken_m.sales_code) 说明: 1) 查询在anken_m表中存在,但是在my_list_temp_m表中不存在的sales_code。 2) sales_code是anken_m的主键,my_list_temp_m的外键。 注意: 1) 外层查询表anken_m是查询的对象。 2) 内层查询表my_list_temp_m是条件对象。 3) 内外层的查询表不能相同。 4) 作为关联条件的anken_m表不需要在内层查询FROM后添加。 5) my_list_temp_m.sales_code=anken_m.sales_code条件的左右顺序不影响查询结果。 3 综合运用 UPDATE anken_m SET(plan_type_code, branch_name, business_type_code) =(SELECT anken.plan_type_code,anken.branch_name,anken.business_type_code FROM anken WHERE anken.sales_code=anken_m.sales_code) WHERE EXISTS ( SELECT anken.sales_code FROM anken,my_list_temp_m WHERE my_list_temp_m.sales_code=anken.sales_code AND anken.sales_code=anken_m.sales_code ) 说明: 1) 用一个表的记录数据更新另一个表的记录数据。 2) 用一个SQL语句进行批量更新。 2) sales_code是anken,anken_m的主键,my_list_temp_m的外键。 注意: 1) set 语句中的要被更新字段必须跟数据源字段一一对应,另外数据源查询中的条件必须限定一条记录。也就是根据sales_code可以唯一确定anken的一条记录,和anken_m的一条记录,这样才能保证要被更新的记录和数据源记录的主键是相同的。 2) 根据WHERE EXISTS语句可以确定数据源记录的范围,也就是可以用anken表中哪些记录更新anken_m表。所以anken_m不需要在WHERE EXISTS语句中的FROM后添加。

以上就是IN&EXISTS与NOT IN&NOT EXISTS的优化原则是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

查询 代码 查询表 条件 数据 语句 结果 更新 外层 对象 数据源 索引 原则 相同 字段 性能 顺序 驱动 也就是 关键 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 智能座舱软件开发组织架构 iis服务器是部署后台程序 国家一级青年网络技术师范 互联网信息网络安全公司 招软件开发测试 数据库真的越老越吃香吗 欣美网络技术 网络安全监控的流程 日企软件开发前端 多平台无线打印服务器 中国名人数据库刘塞彪 饥荒联机版专属服务器进不去 北京大学网络安全与执法专业 数据库查询满足多个查询条件 忻州网络安全大队 女生软件开发找工作 派出所如何加强企业网络安全 腾讯云服务器宝塔镜像 数据库规范化是什么阶段建立的 网络安全电子小报资料 网络安全法第七十二条该如何理解 梦幻西游1月新开服务器 提取数据库数据合成一个报表 速卖通为什么要产品数据库 为什么明日之后服务器登不上去 春考网络技术历年考了哪一科 国家网络安全管理方法 数据库编码重复 中职计算机网络技术学考网课 三年级网络安全以防诈骗
0