• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

SQL优化思考_oracle

oracle 搞代码 7年前 (2018-06-14) 126次浏览 已收录 0个评论

    初入oracle殿堂的人,在学写SQL语句时一般会得到一个教诲,那就是exists比in更要高效,但仔细想象要是真的这么简单那干脆去掉in,岂不是省去很多麻烦?
  
 自己对这两种查询语句写法的认识也比较浅显,但是觉得还是比较有效,所以有兴趣的可以瞄一眼哦
  
  ……
  
  先说IN
  
  他相当对inner table执行一个个带有distinct的子查询语句,然后得到的查询结果集再与outer table进行连接,当然连接的方式和索引的使用仍然同于普通的两表连接。
  
  select * from T1 where x in (select y from T2);
  
  可以转换成如下
  
  select * from
  
  T1,(select distinct y from T2) T2
  
  where T1.x=T2.y;
  
  再说exists
  
  实际上exists相当于对outer table进行全表扫描,用从中检索到的每一行与inner table做循环匹配输出相应的符合条件的结果,其主要开销是对outer table的全表扫描(full scan),而连接方式是nested loop方式。
  
  可以写成
  
  select * from T1 where exists (select NULL from T2 where T2.y=T1.x);
  
  转换成
  
  for cursor1 in (select * from T1)
  
  loop
  
  if (exists (select NULL from T2 where T2.y=cursor1.x))
  
  then
  
  返回匹配的记录;
  
  end if;
  
  end loop;
  
  通过上面的解释,现在很容易明白当T2数据量巨大且索引情况不好(大量重复值等),则不宜使用产生对T2的distinct检索而导致系统开支巨大的IN操作,反之当T1表数据量巨大(不受索引影响)而T2表数据较少且索引良好则不宜使用引起T1全表扫描的EXISTS操作,

欢迎大家阅读《SQL优化思考_oracle,跪求各位点评,若觉得好的话请收藏本文,by 搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:SQL优化思考_oracle
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址