• 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的“执行计划”拿出来,从原理层面解释一下。

  • 相关阅读:
    LIS问题:二分+DP
    AndroidBDMap学习05:连续定位地图
    AndroidBDMap学习04:定位配置的设置实现
    AndroidBDMap学习03:定位获取当前地点的信息
    AndroidBDMap学习02:获取用户的相关权限
    AndroidBDMap学习01:基于百度地图SDK的配置以及利用API实现一个简单的地图应用
    数据结构--可迭代红黑树模板类(C++)
    数据结构--大小根堆模板类(C++)
    Apache poi导出的文件损坏解决办法
    deepin图标显示不正常的问题解决
  • 原文地址:https://www.cnblogs.com/kevinge/p/2690112.html
Copyright © 2020-2023  润新知