select (sysdate - EVENTSTARTTIME) D
     from (SELECT EVENTSTARTTIME
             FROM tblWIPEquipStatusLog
            Where MainStatusNo in (1, 5, 8, 9)
            ORDER BY EVENTSTARTTIME DESC)
    where rownum = 1tblWIPEquipStatusLog表有100M以上,查詢速度很慢。
請問此sql能不能優化,提高查詢效率。

解决方案 »

  1.   

    主要是内查询的order by 导致查询变慢吧
      

  2.   

     select (sysdate - EVENTSTARTTIME) D
         from (SELECT MAX(EVENTSTARTTIME) EVENTSTARTTIME
                 FROM tblWIPEquipStatusLog
                Where MainStatusNo in (1, 5, 8, 9)
                --ORDER BY EVENTSTARTTIME DESC
               )
        where rownum = 1
      

  3.   

    select (sysdate - b.EVENTSTARTTIME) D
         from (SELECT EVENTSTARTTIME
                 FROM tblWIPEquipStatusLog
                Where MainStatusNo in (1, 5, 8, 9)
              ) b
        where rownum = 1   ORDER BY b.EVENTSTARTTIME DESC
    先找出来后在排序
      

  4.   

    看不到此表的实际数据不好回答啊可以根据MainStatusNo建分区么?
      

  5.   

    看字段名MainStatusNo应该不同的值很少,如果没有其它特殊处理,在该字段上建一个位图索引,然后:
     
    SELECT SYSDATE-MAX(EVENTSTARTTIME) EVENTSTARTTIME
      FROM tblWIPEquipStatusLog
      Where MainStatusNo in (1, 5, 8, 9)
      

  6.   

    5楼的方法很好,性能提升不少,但是当EVENTSTARTTIME有空值时,就和楼主的结果不一致了,这点得调整下。
    另外,100M的数据是否要分区还要根据服务器资源的实际情况来定,我们系统一些表都2个G了,也没使用分区表。
      

  7.   

    經過測試
    select (sysdate - EVENTSTARTTIME) D
      from (SELECT MAX(EVENTSTARTTIME) EVENTSTARTTIME
      FROM tblWIPEquipStatusLog
      Where MainStatusNo in (1, 5, 8, 9)
      --ORDER BY EVENTSTARTTIME DESC
      )
      where rownum = 1
    的確在速度方面有點提升。
    select (sysdate - b.EVENTSTARTTIME) D
         from (SELECT EVENTSTARTTIME
                 FROM tblWIPEquipStatusLog
                Where MainStatusNo in (1, 5, 8, 9)
              ) b
        where rownum = 1   ORDER BY b.EVENTSTARTTIME DESC
    則取出的不是想要的數據。索引方面,不是很清楚。在公司沒有聽他們說用過。(DB管理DB,開發做開發)
    看到大家的回帖,深受啟發。謝謝!