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

问题可能是连接条件中的“或”。这往往优化得很差。

这个版本对两个结果进行了明确的联合:

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 回答