2013-06-01 43 views
0

Oracle & SQL對我而言是新的,而且我還處於學習階段。如何在oracle中調優自我加入查詢11g

你能幫我調整下面的oracle查詢嗎? 此表包含〜95個lac記錄,需要1個小時才能使用此查詢檢索數據。

您的建議/意見/幫助將不勝感激。

在此先感謝。

SELECT A.CNO AS CNO, 
     A.FNO AS FNO, 
     A.CID AS CID, 
     A.IID    AS IID 
    FROM CAC_LKP A, 
     (SELECT C_DATE, CNO, FNO 
      FROM (SELECT MAX(CAC_LKP.C_DATE) AS C_DATE, 
         CAC_LKP.CNO AS CNO, 
         CAC_LKP.FNO AS FNO 
        FROM CAC_LKP 
       WHERE ACTIVE = 'Y' 
       GROUP BY CNO, FNO)) B 
WHERE A.C_DATE = B.C_DATE 
    AND A.CNO = B.CNO 
    AND A.FNO = B.FNO 
    AND A.ACTIVE = 'Y' 

主鍵定義在c_date,iid,active的組合上。

+0

你在你的表上有什麼索引? – ankurtr

回答

2

您正在使用聚合來獲取變量組的最近日期。然後您將獲得匹配這些日期的行。

優化查詢,忘記了自我加入並使用分析功能來代替:

select cno, fno, cid, lid 
from (select A.*, 
      rank() over (partition by cno, fno order by c_date desc) as seqnum 
     from cac_lkp A 
     where A.active = 'Y' 
    ) A 
where seqnum = 1; 
+0

哇..大..它看起來很有希望..將嘗試這個,讓你知道性能的提高..感謝您的快速幫助.. :) –

0

由於有大量的數據,去除不必要的子查詢可以提高性能。確保你在C_DATE,CNO,FNO和A.ACTIVE上有索引。試試這個sql

SELECT A.CNO AS CNO, 
     A.FNO AS FNO, 
     A.CID AS CID, 
     A.IID    AS IID 
    FROM CAC_LKP A, 
     (SELECT MAX(CAC_LKP.C_DATE) AS C_DATE, 
         CAC_LKP.CNO AS CNO, 
         CAC_LKP.FNO AS FNO 
        FROM CAC_LKP 
       WHERE ACTIVE = 'Y' 
       GROUP BY CNO, FNO) B 
WHERE A.C_DATE = B.C_DATE 
    AND A.CNO = B.CNO 
    AND A.FNO = B.FNO 
    AND A.ACTIVE = 'Y' 
+0

謝謝Ankur,我試過索引,但沒有看到這樣的改善。:( –

+0

@ParthSavjani:請在嘗試查詢後發佈您的結果。上述查詢或Gordon的查詢是否影響您的響應時間? – ankurtr