原文地址: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
从以上的数据可以得出几个结论:
- 使用to_number是非常耗时的,(92.758-16.661)/16.661 =456.737%
- 加上distinct,会对性能有相当大的影响(20.826-16.661)/16.661 = 24.998%
- exists比in效率要高很多,大概是in的 16.661/0.047 = 35.449倍 (我指的差异很大的SQL也就是使用in和exists的这两个SQL)
疑问:
为什么使用exists的效率比in高这么多?数据库是如何解析这些SQL的?关于这个问题,我下次把Oracle的“执行计划”拿出来,从原理层面解释一下。
关于这个问题,我下次把Oracle的“执行计划”拿出来,从原理层面解释一下。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步