0

長時間実行されている Oracle SQL クエリを微調整するのに助けが必要です。

 SELECT 
     MIN( E.MKT_PRC),
     MAX( E.MKT_PRC)
 FROM 
     GL_VESTINGPRIME_RPT VP 
     INNER JOIN GRANTZ G 
         ON G.GRANT_NUM = VP.GRANT_NUM 
         OR G.XFER_ORIG = VP.GRANT_NUM 
     INNER JOIN EXERCISE E 
         ON E.GRANT_NUM = G.GRANT_NUM
 WHERE 
     VP.RUNTIME_ID = :B4 
     AND VP.PLAN_NUM = NVL(:B3, VP.PLAN_NUM) 
     AND E.EXER_DT BETWEEN :B2 + 1 
     AND :B1 
4

1 に答える 1

2

問題はおそらく、結合条件の「または」です。これは、最適化が非常に不十分になる傾向があります。

このバージョンは、2 つの結果を明示的に結合します。

SELECT MIN( E.MKT_PRC), MAX( E.MKT_PRC)
from ((select E.MKT_PRC, E.MKT_PRC
       FROM GL_VESTINGPRIME_RPT VP INNER JOIN GRANTZ G 
            ON G.GRANT_NUM = VP.GRANT_NUM OR
            EXERCISE E
            ON E.GRANT_NUM = G.GRANT_NUM
       WHERE VP.RUNTIME_ID = :B4 AND
             VP.PLAN_NUM = NVL(:B3, VP.PLAN_NUM) AND
             E.EXER_DT BETWEEN :B2 + 1 AND :B1
     ) union all
     (select E.MKT_PRC, E.MKT_PRC
       FROM GL_VESTINGPRIME_RPT VP INNER JOIN GRANTZ G 
            ON G.XFER_ORIG = VP.GRANT_NUM OR
            EXERCISE E
            ON E.GRANT_NUM = G.GRANT_NUM
       WHERE VP.RUNTIME_ID = :B4 AND
             VP.PLAN_NUM = NVL(:B3, VP.PLAN_NUM) AND
             E.EXER_DT BETWEEN :B2 + 1 AND :B1
     )) t

テーブルに適切なインデックスがある場合、これはかなり高速です。

于 2013-01-08T19:09:25.430 に答える