• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
开水房
ASP.NET
博客园    首页    新随笔    联系   管理    订阅  订阅
exists比in效率要高很多 转自地瓜哥的博客

原文地址:http://www.diguage.com/archives/30.html 

昨天遇到一些很奇怪的SQL。

  业务:查询有员工的组织的数量。

  很奇怪,为什么同样的数据、同样的业务逻辑,两个SQL差距怎么这么大啊?!具体SQL如下:

  注意:sys_organize表有36640条数据,sys_staff_org_relat表中有3068条数据。

  

第一种情况:原始SQL的情况:

帮助
1
2
3
4
select count(1)
  from sys_organize t
 where t.organize_id not in
       (select c.organize_id from sys_staff_org_relat c);

  执行结果:16.661s

  

  

第二个情况:加distinct的情况:

帮助
1
2
3
4
select count(1)
  from sys_organize t
 where t.organize_id not in
       (select distinct c.organize_id from sys_staff_org_relat c);

  执行结果:20.826s

  

  

  

第三种情况:加to_number()后

帮助
1
2
3
4
select count(1)
  from sys_organize t
 where t.organize_id not in
       (select to_number(c.organize_id) from sys_staff_org_relat c);

  执行结果:92.758s

  

  

  

第四种情况:同时加上distinct、to_number()后

帮助
1
2
3
4
select count(1)
  from sys_organize t
 where t.organize_id not in
       (select distinct to_number(c.organize_id) from sys_staff_org_relat c);

  执行时间:96.721s;

  

  

  

最后:使用exists

帮助
1
2
3
4
5
select count(1) --t.*
  from sys_organize t
 where not exists (select c.organize_id
          from sys_staff_org_relat c
         where t.organize_id = c.organize_id);

  执行时间:0.047s

  

  从以上的数据可以得出几个结论:

  1. 使用to_number是非常耗时的,(92.758-16.661)/16.661 =456.737%
  2. 加上distinct,会对性能有相当大的影响(20.826-16.661)/16.661 = 24.998%
  3. exists比in效率要高很多,大概是in的 16.661/0.047 = 35.449倍 (我指的差异很大的SQL也就是使用in和exists的这两个SQL)
  4.  

  疑问:

  为什么使用exists的效率比in高这么多?数据库是如何解析这些SQL的?关于这个问题,我下次把Oracle的“执行计划”拿出来,从原理层面解释一下。

  关于这个问题,我下次把Oracle的“执行计划”拿出来,从原理层面解释一下。

posted on 2012-09-18 10:05  白开水皮皮  阅读(1408)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3