select TB.TaskID,
       TB.TaskName,
       case TB.InfoID
         when 1 then
          'aa'
         when 2 then
          'bb'
         when 3 then
          'cc'
       end as InfoID,
       TB.DateBegin,
       TB.DateEnd,
       Case TB.TaskStatus
         when 0 then
          '00'
         when 1 then
          '11'
         when 3 then
          '33'
       End as TaskStatus,
       TB.TaskPlanAmount,
       (select count(*) from Taskdetailinfo where TaskId = TB.TaskID) as TaskTotalAmount
from   TaskBaseInfo TB
where  1 = 1 and TB.TaskStatus <> 2 and
       to_date(DATEBEGIN, 'YYYY.MM.DD') <= trunc(sysdate) and
       to_date(DATEEND, 'YYYY.MM.DD') >= trunc(sysdate) and taskstatus = 0
order  by TB.DATEBEGIN desc, TB.TaskID asc快的0.6s,慢的91s。
这个差别未免太大了。
而且,开始执行时很慢,多执行几次后,一下子就快了。
请教众位。

解决方案 »

  1.   


    select   TB.TaskID, 
                  TB.TaskName, 
                  decode(  TB.InfoID ,
                      1,'aa', 
                      2,'bb',
                      'cc')   InfoID, 
                  TB.DateBegin, 
                  TB.DateEnd, 
                  decode(TB.TaskStatus, 
                         0,'00', 
                         1 ,'11' ,
                         '33' 
                  )  TaskStatus, 
                  TB.TaskPlanAmount, 
                  count(*)    TaskTotalAmount 
    from       TaskBaseInfo   TB 
    where     1   =   1   and   TB.TaskStatus   <>   2   and 
                  to_date(DATEBEGIN,   'YYYY.MM.DD')   <=   trunc(sysdate)   and 
                  to_date(DATEEND,   'YYYY.MM.DD')   > =   trunc(sysdate)   and   tasksgroup by TB.TaskID, TB.TaskName,TB.InfoID,TB.DateBegin, TB.DateEnd,TB.TaskStatus, TB.TaskPlanAmountorder     by   TB.DATEBEGIN   desc,   TB.TaskID   asc 用这个语句看看速度如何
      

  2.   

    第一次最慢,后面快是oracle的共享池缘故,
    建这几个字段的索引,会快一些
    TB.TaskID, TB.TaskName,TB.InfoID,TB.DateBegin, TB.DateEnd,TB.TaskStatus, TB.TaskPlanAmount
      

  3.   

    to hebo2005:
    感谢你帮我修改sql。
    但是你把“select   count(*)   from   Taskdetailinfo   where   TaskId   =   TB.TaskID”省略了啊。
    其实,关键就是慢在这个标量子查询里(Taskdetailinfo表)。to yanleigis:
    TB.TaskID作为主键是索引。其他索引还没有创建。索引太多了可能也会影响速度的。
    因为是同一sql啊。
    有可能是共享池的缘故。我再把情况描述一下:
    开始几次执行sql,速度都是一分多钟。
    (期间,把标量子查询去掉,速度会很快。把标量子查询加上去,速度变回原来很慢。此证明速度慢,主要还是因为标量子查询的原因。)当多执行几次后,速度突然提高了,竟然不要一秒钟。以后就一直这么快。
    第二天再执行的时候,又很慢,然后多执行几次,又....对二位的回复十分感谢。
    希望有更多的朋友参与讨论。
      

  4.   

    噢,这句我没看清楚,以为是同一张表,想同张表的话,直接GROUP就可以了
    select       count(*)       from       Taskdetailinfo       where       TaskId       =       TB.TaskID
      

  5.   

    select   TB.TaskID, 
                  TB.TaskName, 
                  case   TB.InfoID 
                      when   1   then 
                        'aa' 
                      when   2   then 
                        'bb' 
                      when   3   then 
                        'cc' 
                  end   as   InfoID, 
                  TB.DateBegin, 
                  TB.DateEnd, 
                  Case   TB.TaskStatus 
                      when   0   then 
                        '00' 
                      when   1   then 
                        '11' 
                      when   3   then 
                        '33' 
                  End   as   TaskStatus, 
                  TB.TaskPlanAmount, 
                     count(*)     as   TaskTotalAmount 
    from       TaskBaseInfo   TB ,Taskdetailinfo TC
    where    TC.TaskId   =   TB.TaskID and  1   =   1   and   TB.TaskStatus   <>   2   and 
                  to_date(DATEBEGIN,   'YYYY.MM.DD')   <=   trunc(sysdate)   and 
                  to_date(DATEEND,   'YYYY.MM.DD')   > =   trunc(sysdate)   and   taskstatus   =   0 
    group by TB.TaskID,  TB.TaskName,DateBegin,DateEnd,TaskStatus,TaskPlanAmount
    order     by   TB.DATEBEGIN   desc,   TB.TaskID   asc 试试这个吧,我想内连接会比子循环要快
      

  6.   

    ORACLE缓冲的问题就不说了。你的代码写的有问题。
    select   count(*)   from   Taskdetailinfo   where   TaskId   =   TB.TaskID,
    直接放到SQL里面,如果表“TaskBaseInfo”里面只有一条记录,就执行一次,
    如果这个表里面有一万条记录,上面的查询就要执行一万次。
    可以试一下。
      

  7.   

    to lovezp521:
    3q
    经测试,内连接与标量子查询速度相当。还有count为0时就查不出来了。用左连接也未果。
    我想问题的关键,主要是找出速度差别大的原因。因为这个差别太大了。to VASDZASD:
    这是一个一对多的关系。
    Taskdetailinfo 的针对于taskid的count(*)会有几十万条。慢就慢在这里。
    您说我写的代码有问题,那应该怎么写呢??
      

  8.   

    先找出TaskBaseInfo表帶條件的數據然后再和另一個表關連,兩表的taskid加上索引,留意一下加group by 和order by
    和不加時的效率,相應做修改,如果找出來的數據重復性很大的話超過總數據的30%那就不要使索引,如果還慢那看看他的執行計划,最強制加上規則...我覺得加上rule規則就可以,,group by 是做合并動作但他還附帶一次排序,而索引本身是帶升序排序的,你看你自己的需求含量一下....