SELECT DID,PID,STATUS,ATTR,QZH,JH,ZRZ,WENHAO,TITLE,RQ,YS,BGQX,BMDZ,SSBM,MJ,LM1,ND,BZ FROM D_P_FILE22_13 WHERE  STATUS!= '1' AND UPPER(QZH) LIKE '%13%' AND UPPER(LM1) LIKE '%Y%' AND ((USRROLE(CREATOR) = 2 AND ATTR IN(0, 4)) OR  (USRROLE(CREATOR) = 5 AND ATTR IN(2, 4))) ORDER BY   LM1,ND,WJLX ASC,intercept(WENHAO) ASC 
真的好慢啊,要是优化该怎么优化呢

解决方案 »

  1.   

    UPPER(QZH) LIKE '%13%' AND UPPER(LM1) LIKE '%Y%'这里的两个upper没有用,可以不要
    where后面的条件可以根据表中数据的情况进行顺序的调整也可考虑一些子查询
      

  2.   

    1.把尽可能筛选条件比较大的条件放在第一个,依次类推
    2.如果要用到like这样的模糊匹配,可以根据需要尽可能改成 like 'rr%' 这种形式
      

  3.   

    好多函数,还有like '%%'
    ....
      

  4.   

    不要在 where 子句的字段名称上使用函数,比如 upper(),这样会影响索引的使用。
      

  5.   

    你这sql除了ATTR字段能用上索引(如果这个字段上用上索引)
    SELECT DID,
           PID,
           STATUS,
           ATTR,
           QZH,
           JH,
           ZRZ,
           WENHAO,
           TITLE,
           RQ,
           YS,
           BGQX,
           BMDZ,
           SSBM,
           MJ,
           LM1,
           ND,
           BZ
      FROM D_P_FILE22_13
     WHERE STATUS != '1'
       AND QZH  LIKE '%13%'
       AND UPPER(LM1) LIKE '%Y%'
       AND ((USRROLE(CREATOR) = 2 AND ATTR IN (0, 4)) OR
           (USRROLE(CREATOR) = 5 AND ATTR IN (2, 4)))
     ORDER BY LM1, ND, WJLX , intercept(WENHAO) ASCQZH  字段不用UPPER函数,在这个字段上建索引,在ATTR 字段上建位图索引。试一下