2015-11-17 64 views
1

目前我有一個子查詢,它本身就有一個子查詢。性能方面,當我把它放到我的存儲過程中時,這並不會很好。我想知道是否有任何方法可以提高此代碼的性能,或者查看編寫此代碼的不同方式?提高子查詢的性能

基本上我正在查找價格數據,但如果價格發生變化,我們只會將價格記錄加載到我們的倉庫中。所以我需要查看每個工具的最新日期,我們已收到價格,然後返回該價格。我有以下代碼:

DECLARE @EndDate DATETIME 

SET @EndDate = '2015-10-31' 

SELECT     
ip2.INSTR_ID 
, ip2.PRC_TMS 
, ip2.PRC_CURR_CDE 
, COALESCE(MAX(CASE 
        WHEN ip2.PRC_TYP = 'CLO' THEN ip2.PRC_QUOTE_AMT 
       END), 
     MAX(ip2.PRC_QUOTE_AMT)) AS PRC_QUOTE_AMT 

FROM ISSUE_PRICE AS ip2 

INNER JOIN (
      SELECT 
       INSTR_ID AS INSTR_ID 
      , MAX(PRC_TMS) AS PRC_TMS 

      FROM ISSUE_PRICE 
      WHERE PRC_SRCE_TYP = 'SSC' 
      AND PRC_TMS <= @EndDate 
      AND PRC_TYP IN ('LST', 'CLO') 
      GROUP BY INSTR_ID) AS i2 
ON i2.INSTR_ID = ip2.INSTR_ID 
AND i2.PRC_TMS = ip2.PRC_TMS 

WHERE ip2.PRC_SRCE_TYP = 'SSC' 
AND ip2.PRC_TYP IN ('LST', 'CLO') 
GROUP BY ip2.PRC_TMS, ip2.INSTR_ID, ip2.PRC_CURR_CDE 

任何幫助將不勝感激。

感謝

+0

我要做的第一件事是看我對你使用這些表的索引,確保統計信息是到那些表的日期,然後在內部部分之外尋找將聚合移動到儘可能高的水平。另外,請在更快的執行時間內使用'EXISTS'子句產量進行研究。大多數情況下,提供關於表中索引的一些信息以及查詢表中的數據量是非常有用的,作爲開始。 –

+0

[每組檢索n行](http://dba.stackexchange.com/questions/86415/retrieving-n-rows-per-group) –

回答

0

這可以通過使用Row_Number窗函數身份最大PRC_TMSINSTR_ID來實現。試試這個,

;WITH cte 
    AS (SELECT Row_number()OVER(partition BY INSTR_ID 
        ORDER BY PRC_TMS DESC) AS rn,* 
     FROM ISSUE_PRICE 
     WHERE PRC_SRCE_TYP = 'SSC' 
       AND PRC_TMS <= @EndDate 
       AND PRC_TYP IN ('LST', 'CLO')) 
SELECT ip2.INSTR_ID, 
     ip2.PRC_TMS, 
     ip2.PRC_CURR_CDE, 
     COALESCE(Max(CASE 
         WHEN ip2.PRC_TYP = 'CLO' THEN ip2.PRC_QUOTE_AMT 
        END), Max(ip2.PRC_QUOTE_AMT)) AS PRC_QUOTE_AMT 
FROM cte 
WHERE RN = 1 
GROUP BY ip2.PRC_TMS, 
      ip2.INSTR_ID, 
      ip2.PRC_CURR_CDE 
0

子查詢不一定會導致性能問題。但是,你可以做你想做更有效和簡潔什麼用窗函數:

SELECT ip.INSTR_ID, ip.PRC_TMS, ip.PRC_CURR_CDE, 
     COALESCE(MAX(CASE WHEN ip.PRC_TYP = 'CLO' THEN ip.PRC_QUOTE_AMT 
        END), 
       MAX(ip.PRC_QUOTE_AMT) 
       ) AS PRC_QUOTE_AMT  
FROM (SELECT ip.*, 
      MAX(PRC_TMC) OVER (PARTITION BY INSTR_ID) as MAX_PRC_TMS 
     FROM ISSUE_PRICE ip 
     WHERE ip.PRC_SRCE_TYP = 'SSC' AND ip.PRC_TYP IN ('LST', 'CLO') 
    ) ip 
WHERE ip.PRC_TMS = ip.MAX_PRC_TMS 
GROUP BY ip.PRC_TMS, ip.INSTR_ID, ip.PRC_CURR_CDE;