SELECT COUNT(*) MUCount,COUNT(DISTINCT USERID) SMCount
 FROM Userchange u
 WHERE  exists (SELECT *
                           FROM   manageunit m
                           WHERE u.Machineid=m.TO_NUMBER(DEPNAME)
                           delsign = 0 AND ismachineid=1 
                           CONNECT BY PRIOR  managerid=parent 
                           START WITH parent=id);加索引,然后测试。

解决方案 »

  1.   

    to  welyngj(平平淡淡)
    非常感谢,但是还是不行,一样满!
    怎么办呀?
      

  2.   

    先做explain plan,再把结果贴出来看看.
      

  3.   

    结果只有一个条记录,就是人数。
     比如节点
       A1(id=1 )
        A11(id=2 )
          1(id=3 )
          2(id=4 )
        A12(id=5)
          3(id=6)
          4(id=7)
       B1(id=8 )
        B11(id=9)
          5(id=10)
          6(id=11)
     子查询 中的id=8得到结果为10、11, 子查询中id=1得到结果1、2、3、4
    流水表中的Machineid就记载了1、2、3、4....节点。
      

  4.   

    原语句:
    SELECT COUNT(*) MUCount,COUNT(DISTINCT USERID) SMCount
     FROM Userchange
     WHERE  Machineid IN (SELECT TO_NUMBER(DEPNAME)
                               FROM   manageunit
                               WHERE delsign = 0 AND ismachineid=1 
                               CONNECT BY PRIOR  managerid=parent 
                               START WITH parent=id);
    优化方案:
    SELECT COUNT(userid) MUCount,COUNT(DISTINCT USERID) SMCount 
      FROM (select a.USERID from Userchange a, 
      (SELECT TO_NUMBER(DEPNAME) uid FROM manageunit 
        WHERE delsign = 0 AND ismachineid=1 
        CONNECT BY PRIOR  managerid=parent 
        START WITH parent=id) b 
        where b.uid = a.userid) new_view;优化思路:
    1、在不知道列表数量时尽量不要用无关子查询in(in后面的列表数量不能超过1000,否则oracle出错)。
    2、使用相等关联把条件限制的结果放到视图(new_view)里,再通过视图得到统计结果。
    3、从表中取列尽量只用到索引列(关键是where后面用于比较的列),没有索引的建议加。
    (例如表manageunit中 delsign 和 ismachineid 建成一个索引(and连接的合起来建,or连接的分开建),managerid 和 parent 建成一个索引)
      

  5.   

    To caoxsheng(草绳) 
    太感谢了,我觉得思路特别好。
    我先试试!
      

  6.   

    To caoxsheng(草绳)
     谢谢你的方法,不过速度还不是很快!