日期:2014-05-17  浏览次数:20821 次

这个语句可以优化吗???oracle的。这个运行太慢了。谢谢
SELECT   /*+   rule   */   b.*
      FROM   CPK_DATA_LOTSUM   a,   CPK_DATA_RAW   b
    WHERE   a.LOT_ID   =     (
  SELECT   /*+   rule   */   DISTINCT   a.LOT_ID
  FROM   CPK_DATA_LOTSUM   a
          WHERE   a.REPORT_TIME   > =   to_date( '2005/5/1 ', 'yyyy/mm/dd ')
              AND   a.REPORT_TIME     <   to_date( '2005/5/31 ', 'yyyy/mm/dd ')+1
                AND   ROWNUM   <=   1   )
              AND   a.REPORT_TIME   > =   to_date( '2005/5/1 ', 'yyyy/mm/dd ')
              AND   a.REPORT_TIME     <   to_date( '2005/5/31 ', 'yyyy/mm/dd ')+1
        AND   b.CHART_ID   =   a.CHART_ID
      AND   b.LOT_ID   =   a.LOT_ID
      AND   b.ROUTE_ID   =   a.ROUTE_ID
      AND   b.ITEM_SEQ   =   a.ITEM_SEQ
      AND   b.STEP_SEQ   =   a.STEP_SEQ
      AND   b.REPORT_TIME   =   a.REPORT_TIME
      AND   b.DCOP_MFLD_ID   =   a.DCOP_MFLD_ID


------解决方案--------------------
给,a.REPORT_TIME, b.REPORT_TIME 建索引即可
------解决方案--------------------
你的数据库是什么版本? 为什么要加 rule提示?
------解决方案--------------------
不要用Distinct
------解决方案--------------------
DISTINCT 用 exist 替代
------解决方案--------------------
用exists ,而且根据表中的数据 ,把可以过滤多的条件 放在sql语句的下面,因为语句是从下往上执行的,这样可以先过滤掉更多的数据,以后的执行会比较快。
------解决方案--------------------
1
而且根据表中的数据 ,把可以过滤多的条件 放在sql语句的下面,因为语句是从下往上执行的,这样可以先过滤掉更多的数据,以后的执行会比较快。

2
为什么要加 rule提示?
建议取消 规则提示 现在都流行成本了
估计这个语句从早期数据库拿来的

3 与A表 相连接的表对应的字段是否有建立索引

5改成成本后 可以查看执行计划 你就可以哪条语句慢了
------解决方案--------------------
一、建立时间字段的索引,效率可以提高大约30%;
二、你这个语句的关联怎么这么多?这么多字段合成的组合PK? 最好看一看是不是组合PK。
三、如果不是组合的PK,最好还是别改了。因为关系到你的业务逻辑,慢是慢了点,但不至于出错。
四、最后一个办法,把你用到的两个表优化一下,希望起到点作用。