设为首页 收藏本站
查看: 1335|回复: 0

[经验分享] oracle 求差集的方法

[复制链接]

尚未签到

发表于 2016-7-25 08:11:03 | 显示全部楼层 |阅读模式
  //一个表有一个ID字段,是主键并且是递增的,现在需要一条SQL把这个表没有的ID查出来//例如ID的记录如下:ID124579//我们SQL需要把3,6,8这三个值查出来//这是一个典型的求集合的差集问题:with ta as(select 1 id from dual union allselect 2 from dual union allselect 4 from dual union allselect 5 from dual union allselect 7 from dual union allselect 9 from dual)select level idfrom dualconnect by level<=(select max(id)-min(id)+1 from ta)minusselect id from ta/ID----------368//对于此问题,这里ta中数据很小量的,如果ta的最后一个元素为1000001呢?//那么怎么样的查询才算高效呢?//求集合的差集还有其他方法吗?//下面我们来看看类似情况(求连续递增的数中没有出现的数)的差集怎么的:create table t asselect 1 id from dual union allselect 2 from dual union allselect 3 from dual union allselect 4 from dual union allselect 456 from dual union allselect 10145 from dual union allselect 1044653 from dual///方法一:使用minusselect count(*) from (select level idfrom dualconnect by level<=(select max(id)-min(id)+1 from t)minusselect id from t)/COUNT(*)----------1044646Executed in 1.547 seconds//方法二:使用not existsselect count(*)from (select *from (select level idfrom dualconnect by level<=(select max(id)-min(id)+1 from t)) awhere not exists(select 1from t bwhere a.id=b.id))/COUNT(*)----------1044646Executed in 2.157 seconds//方法三:使用not inselect count(*)from (select *from (select level idfrom dualconnect by level<=(select max(id)-min(id)+1 from t)) awhere a.id not in(select b.idfrom t bwhere a.id=b.id))/COUNT(*)----------1044646Executed in 8.39 seconds//从这里看出,在处理大量数据时,相比于exists,not in(in)的效率是相当低的//所以建议在应用中要尽量使用exists,少用in//因为in要进行元素匹配,对比,而exists只需要判断存在性即可//方法四:使用lag()分析函数select count(*)from (with temp as(select s,efrom (select lag(id) over(order by id)+1 s,id-1 e from t)where e - s >= 0)select a.s + b.rn -1 hfrom temp a,(select rownum rnfrom (select max(e-s+1) gap from temp)connect by rownum <= gap) bwhere a.s + b.rn-1 <= a.eorder by 1)/COUNT(*)----------1044646Executed in 10.313 secondsSQL> set time on;7:11:37 SQL> /COUNT(*)----------1044646Executed in 10.156 seconds7:11:50 SQL> //此方法效率最低,因为我们这里用到了lag()分析函数,max(),min(),以及with临时表,//在一个查询中,使用的函数越多,就会增加oracle的负担,//所以oracle engine在查理此查询时,也需要额外的开销(时间和资源)
  
  原帖:
  http://topic.csdn.net/u/20110514/20/a46a060b-bb96-4ab5-83fd-11711ee203bd.html?seed=1011733181&r=73313442#r_73313442
  oracle lag()分析函数:
  http://blog.csdn.net/BOBO12082119/archive/2011/03/30/6289648.aspx
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-248868-1-1.html 上篇帖子: Oracle Library cache 内部机制 说明 下篇帖子: oracle 用过程获得表的字段
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表