位置: 编程技术 - 正文

IN&EXISTS与NOT IN&NOT EXISTS 的优化原则小结

编辑:rootadmin
1. EXISTS的执行流程 select * from t1 where exists ( select null from t2 where y = x ) 可以理解为: 对于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的执行流程 可以理解为: 注意: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 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 的优化原则小结,希望有所帮助,仅作参考,欢迎阅读内容。

IN&EXISTS与NOT IN&NOT EXISTS 的优化原则小结

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

SQL Server数据库开发的二十一条法则 在这里,我不打算介绍使用SQLServer的窍门,也不能提供一个包治百病的方案,我所做的是总结一些经验----关于如何形成一个好的设计。这些经验来自我

获得SQL数据库信息的代码 SELECTNameFROMMaster..SysDatabasesORDERBYName--获得所有数据库SELECTNameFROM[数据库名]..SysObjectsWhereXType='U'ORDERBYName--获得数据库下的所有表selectnamefromsyscolumnswhereid=obj

在sql查询中使用表变量 USE[DAF_DB]GO/******Object:StoredProcedure[dbo].

标签: IN&EXISTS与NOT IN&NOT EXISTS 的优化原则小结

本文链接地址:https://www.jiuchutong.com/biancheng/349566.html 转载请保留说明!

上一篇:SQLServer中临时表与表变量的区别分析(sql server临时表创建语句)

下一篇:SQL Server数据库开发的二十一条法则(sql server数据库查询语句)

  • 增值税发票系统怎么读入发票
  • 发放上年年终奖个税
  • 公司账户转私人账户要多久时间
  • 进口环节缴纳关税计入
  • 摄影服务属于哪个开票类目
  • 简易征收开出去的票可以抵扣吗
  • 先分后合是什么意思
  • 程序法和实体法的划分标准
  • 住房被征用赔偿标准
  • 属于会计核算方法的
  • 跨区域经营企业
  • 小微企业的认定标准2021
  • 公司开出增值税发票可以作为货款证据起诉
  • 国税注销地税没注销怎么办
  • 供电局开具增值发票
  • 发票的单价开得太低了怎么办?
  • 车辆租赁合同印花税怎么算
  • 车辆施救费会计分录
  • 工商年报单位缴费基数从哪看
  • 残障人士能享受的税收优惠
  • 社保显示已录入什么意思
  • 已抵扣未入账的红字发票
  • 长期股权投资的交易费用计入哪里
  • 固定资产折旧和累计折旧的区别
  • 农产品购货发票
  • 营业收入存入银行分录
  • 如何设置win7系统密码
  • 印花税零申报逾期
  • 往年多交的税能退吗
  • php在apache中有哪些工作方式
  • 税额差异会计分录
  • php+js
  • win10待机屏幕图片设置
  • php rtrim
  • php统计目录中文怎么写
  • 微软edge插件
  • Vue3入门笔记----登录功能
  • php数组处理函数array_push会影响源数组的元素吗
  • php搜索代码
  • 一般纳税人销售给小规模纳税人
  • qt5开发android
  • 纳税人在电子税务局收到优惠政策
  • 增值税发票认证结果通知书在哪里打印
  • 不想预缴所得税交多了怎样先把利润转到费用
  • 母公司可以免子女税吗
  • phpcms api
  • 运营级别划分
  • 土地无形资产摊销年限多少年
  • 无形资产摊销年限
  • 税控盘锁死日期是什么意思
  • 公司贷款谁签字
  • 企业筹建期间可以上市吗
  • 企业流动资产周转率低说明什么
  • 无法收回的款项
  • 小规模纳税人减按1%怎么计算
  • 纳税申报表多缴了怎么办
  • 返利开红字发票怎么做账
  • 百分百控股收益都是股东的么
  • 新办企业必须经过什么核准登记
  • 新会计准则2021执行科目
  • 什么叫归集和分配
  • mysql的crud
  • 苹果os X El capitan无法更新了吗
  • xp双系统怎么设置默认系统
  • win8系统如何查看电脑mac物理地址
  • 升级win10系统后鼠标键盘无法用什么原因
  • 车钥匙失灵了10秒教你快速解决
  • lua struct
  • 安卓十游戏怎么玩
  • 网页设计布局设计
  • css一个页面跳转到另一页面
  • js仿QQ中对联系人向左滑动、滑出删除按钮的操作
  • 详解中国女足出线形势
  • 安卓开发常见问题解决
  • Adding iAd in your App from Unity3d
  • js设计模型
  • javascript ref
  • 小规模纳税人企业所得税2023税率
  • 土地增值税有哪些税收优惠
  • 上海房产税免税面积怎么算
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设