当前位置: 代码迷 >> SQL >> oralce SQL执行对照
  详细解决方案

oralce SQL执行对照

热度:9   发布时间:2016-05-05 11:50:06.0
oralce SQL执行对比
要查询一个人的身高、体重为数字,而体重指数为空的数据。

类似的查询,可能会很多,例如:

userInfo表结构为:
iduser_idnamecodeval
135王五age22
235王五mobile18612341234
335王五idno331228198501024423
-- - - -
437王六age19
537王六mobile13212341234
637王六idnonull
-- - - -
839王七age18
939王七mobile18612341234
1039王七idno13312341234


查询
    年龄>18
    手机号不为空
    哪些人没填写身份证号

正确的查询结果是“王六”

三条语句,完成同样的查询功能,执行效率对比
表结构





第一种写法,使用exists进行查询
 select count(*)   from pis_checkitemindexresult c  where     exists (select 1           from pis_checkitemindexresult c2          where c2.itemindexmiscode = '1.2.4.1' --身高            and f_is_num(c2.itemindexresultvalue) = 'T'            and c2.workno = c.workno)    and exists (select 1           from pis_checkitemindexresult c3          where c3.itemindexmiscode = '1.2.4.2' --体重            and f_is_num(c3.itemindexresultvalue) = 'T'            and c3.workno = c.workno)    and c.itemindexmiscode = '1.2.4.3' --体重指数    and c.itemindexresultvalue is null


PLSQL执行计划:




第二种写法,使用count(*)来查询

select count(*)   from pis_checkitemindexresult c  where  (select count(*)     from pis_checkitemindexresult c2    where c2.itemindexmiscode = '1.2.4.1' --身高      and f_is_num(c2.itemindexresultvalue) = 'T'      and c2.workno = c.workno) > 0        and (select count(*)     from pis_checkitemindexresult c3    where c3.itemindexmiscode = '1.2.4.2' --体重      and f_is_num(c3.itemindexresultvalue) = 'T'      and c3.workno = c.workno) > 0   and c.itemindexmiscode = '1.2.4.3' --体重指数  and c.itemindexresultvalue is null


PLSQL执行计划:




第三种写法:使用inner join来关联查询

select count(*)  from pis_checkitemindexresult c  inner join pis_checkitemindexresult c2 on c.workno = c2.workno  inner join pis_checkitemindexresult c3 on c.workno = c3.workno where      c2.itemindexmiscode = '1.2.4.1'   and f_is_num(c2.itemindexresultvalue)='T'      and c3.itemindexmiscode = '1.2.4.2'   and f_is_num(c3.itemindexresultvalue)='T'      and c.itemindexmiscode = '1.2.4.3'   and c.itemindexresultvalue is null


PLSQL执行计划:
   




问题是哪种方法执行效率最高,现在每个都10分钟都执行不完。
  相关解决方案