2013-01-08 64 views
0

我需要幫助來優化下面長時間運行的Oracle SQL查詢。需要幫助來微調SQL內部連接查詢 - Oracle

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 
+0

您需要提供更多詳細信息,如表結構,數據大小等 –

+0

EXERCISE表記錄計數 - 55086,GRANTZ表記錄計數 - 79180,GL_VESTINGPRIME_RPT是臨時表。d – user1958780

+0

我無法放置完整的表結構因爲它超過了放置在這裏的字符,所以我在這裏看不到附件選項。請讓我知道表結構中所需的確切信息(如PK,FK,索引列名......)。請回復。 – user1958780

回答

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 

如果你對你的表適當的索引,這應該是非常快。