select usrid,usrnam,sfzh,crtdat,cwname,homeadd,usrtyp,grade,
ppay,zfdj,czbz,cgbt,jsbt,ppay+zfdj+czbz+cgbt+jsbt  total,
allppay,allzfdj,allczbz,allcgbt,alljsbt,allint,allppay+allzfdj+allczbz+allcgbt+alljsbt+allint alltotal
 from (select a.usrid,a.usrnam,a.sfzh,a.crtdat,b.name cwname,a.HOMEADD,a.USRTYP,a.GRADE,
(select  nvl(sum(paymny+bpaymny),'0') 
from NB_BASEPAY 
where usrid=a.usrid 
and YEAR='2011') ppay,

(select nvl(sum(czdj),'0') from NB_PI 
where USRID =a.usrid 
and yydat='2011') zfdj,
(select nvl(sum(CZBZ),'0') from NB_PI 
where USRID =a.usrid 
and yydat='2011') czbz,
(select nvl(sum(PAYMNY),'0') from NB_CWPAYDTL 
where sfzh=a.sfzh
and year='2011') cgbt,
'0' jsbt,nvl(a.SUMMNY2,'0') allppay,
(select nvl(sum(czdj),'0') from NB_PI 
where USRID =a.usrid ) allzfdj
,nvl(a.SUMMNY3,'0') allczbz,
(select nvl(sum(PAYMNY),'0') from NB_CWPAYDTL 
where sfzh=a.sfzh) allcgbt,
'0' alljsbt,'0'  allint
from NB_OPERROSTER a,NB_BP b   
where a.orga=b.id  

这个执行查出30000条记录  20毫秒
  在后面加上条件where ppay!=0  查出9条  5000豪秒多请问是为什么?

解决方案 »

  1.   

    用toad运行explain plan看一下吧
      

  2.   

    符合条件的数据太少了,过滤花去了大部分时间
    select ta.col_name,tb.col_name
    from ta,tb
    where about_ta_tb_condition
    这个语句一般的都是先将ta,tb表进行笛卡尔积,然后再在此笛卡尔集里面找出满足where条件的数据,
    即一条一条的筛选,满足条件的就出现在结果中,如果不满足,那么继续寻找,知道堆表中最后一条数据
      

  3.   

    where a < 0 and a > 0
    或用<>试试
    !=不走索引
      

  4.   

    两个语句分别再外面加上select count(1) from ()再比较一下