当前位置:   article > 正文

去重以及 exists和in的效率对比_oracle exist()去重原理

oracle exist()去重原理
  1. exists 主要是用作 一对一 或者 一对多的 情况下
  2. 什么是一对一,或者一对多呢
  3. 比如 现在有两个表 部门表,以及员工表。
  4. 部门表一般都是唯一的,而员工表 就存在 多个员工对应一个部门的情况。
  5. 在这种情况下,部门表 对 员工表就是一对多的关系。
  6. select * from A where exists(select 1 from B where A.id=B.a) ;
  7. 当B表数据较大时不适合使用in(),因为它会B表数据全部遍历一次.
  8. 如:A表有10000条记录,B表有1000000条记录,那么最多有可能遍历10000*1000000次,效率很差.
  9. 再如:A表有10000条记录,B表有100条记录,那么最多有可能遍历10000*100次,遍历次数大大减少,效率大大提升.
  10. 结论:in()适合B表比A表数据小的情况
  11. exists()会执行A.length次,它并不缓存exists()结果集,因为exists()结果集的内容并不重要,重要的是结果集中是否有记录,如果有则返回true,没有则返回false.
  12. 当B表比A表数据大时适合使用exists(),因为它没有那么遍历操作,只需要再执行一次查询就行.
  13. 如:A表有10000条记录,B表有1000000条记录,那么exists()会执行10000次去判断A表中的id是否与B表中的id相等.
  14. 如:A表有10000条记录,B表有100000000条记录,那么exists()还是执行10000次,因为它只执行A.length次,可见B表数据越多,越适合exists()发挥效果.
  15. 再如:A表有10000条记录,B表有100条记录,那么exists()还是执行10000次,还不如使用in()遍历10000*100次,因为in()是在内存里遍历比较,而exists()需要查询数据库,我们都知道查询数据库所消耗的性能更高,而内存比较很快.
  16. 以上总结就是
  17. (1). select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
  18. T1数据量小而T2数据量非常大时,T1<<T2 时,(1)的查询效率高。
  19. (2). select * from T1 where T1.a in (select T2.a from T2) ;
  20. T1数据量非常大而T2数据量小时,T1>>T2 时, (2) 的查询效率高。
  21. 去重
  22. 一对一或者一对多去重的话,可以使用 exists 也可以 使用group by
  23. 但是 不是 一对一或者一对多去重的话 ,优化就要使用 group by
  24. 或是使用 min(rowid)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/480027
推荐阅读
相关标签
  

闽ICP备14008679号