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