INSERT  INTO  msg(phone,message,date,state)  
             select  usertel,msg,sysdate,'s'  from  fm,a  where  fm.status<>10  and    fm.status<>11  
and    fm.status<>0  and  sysdate-interval  '10'  hour  >=date  and  sysdate-interval  '30'  hour  <  date  
and  fm.nbr  not  in(select  nbr  from  history  where  nbr=fm.nbr  
and  (status=1  OR  status=2)  and  (DS='A'  OR  DS='B'  OR  DS='C'  OR  DS='D'))  
and  ((fm.id<>'50'  and  fm.id=a.ID  and  a.st='A')  
or(fm.id='50'  and  fm.doid=a.ID    and  a.st='A')  ); 加了这个条件变得非常慢,用游标循环都比这个快,这个有没办法优化,哪能优化都行?
and  ((fm.id<>'50'  and  fm.id=a.ID  and  a.st='A')  
or(fm.id='50'  and  fm.doid=a.ID    and  a.st='A')  );

解决方案 »

  1.   

    你把两个条件分开试,比如写两个条件的查询语句,用union联合起来.
      

  2.   

    如果只是考虑优化最后两句的话,下面应该是可以比较好的,没有数据,没试过,LZ可以试试INSERT INTO msg
                (phone, MESSAGE, DATE, state)
       SELECT usertel, msg, SYSDATE, 's'
         FROM fm, a
        WHERE fm.status <> 10
          AND fm.status <> 11
          AND fm.status <> 0
          AND SYSDATE - INTERVAL '10' HOUR >= DATE
          AND SYSDATE - INTERVAL '30' HOUR < DATE
          AND fm.nbr NOT IN (
                 SELECT nbr
                   FROM history
                  WHERE nbr = fm.nbr
                    AND (status = 1 OR status = 2)
                    AND (ds = 'A' OR ds = 'B' OR ds = 'C' OR ds = 'D'))
          AND (DECODE (fm.ID, '50', fm.odid, fm.ID) = a.ID AND a.st = 'A');
      

  3.   

    用直接装载,应该会提高,7,8背的速度
    对sql语句,除了 增加索引,优化空间很小
      

  4.   

    尽量少用 <>,not in等运算符号。
      

  5.   

    hevin(没有什么是不可能的)
    谢谢你!你的优化速度提高5倍!