2011-04-06 56 views
1

我想做一個select語句,連接三個內嵌表函數(SQL Server 2005)的結果。前兩項功能加入如下:加入3個快速udfs,使一個緩慢的查詢

SELECT Client_no 
     ,Portfolio_no 
     ,Sum(Nominal * Price) AS Value 
FROM Dbo.Udf_bulkportfolioholdings (@TradeDate) AS Holdings 
     INNER JOIN Dbo.Udf_bulkpricesecurities (@TradeDate) AS Prices ON Prices.Security_no = Holdings.Security_no 
GROUP BY Client_no 
      ,Portfolio_no 

該查詢大約需要0.7秒才能運行。

第三個功能是單獨詢問如下,需要0.006秒來運行:

SELECT Currencyid 
     ,Currencycode 
     ,Multiexchangerate 
    FROM Dbo.Udf_bulkexchangerates(@TradeDateint) 

所以加入了一些非常快速的查詢起來應該讓一個快速的查詢,對吧?

SELECT Client_no 
     ,Portfolio_no 
     ,Sum(Nominal * Price * Multiexchangerate) AS Value 
FROM Dbo.Udf_bulkportfolioholdings (@TradeDate) AS Holdings 
     INNER JOIN Dbo.Udf_bulkpricesecurities (@TradeDate) AS Prices ON Prices.Security_no = Holdings.Security_no 
     INNER JOIN Dbo.Udf_bulkexchangerates(@TradeDateint) AS Fx ON Fx.Currencycode = Prices.Currency 
GROUP BY Client_no 
      ,Portfolio_no 

將第三個函數加入查詢,它需要40多秒!

我已經仔細檢查了連接中的字段,它們是正確的字段。我會想/希望查詢優化器查看這三個函數,並首先獲取所有三個表,然後將它們連接在一起。但它看起來像是運行每個記錄返回的第三個查詢?

我已經嘗試將交換率首先返回到表變量,並將執行時間縮短到9秒,但這似乎很混亂。有沒有辦法強制優化器先運行三個表,然後加入?

任何幫助將不勝感激。

回答

1

那麼,你真的試試這個:首先加入2表,然後加入派生表交換udf。這可能會使優化器以您想要的方式工作。

+0

謝謝,這工作完美。執行時間縮短至3秒。在不同的方面,這是否會成爲使用CTE的地方?我對他們真的不是很瞭解,但看起來大致相似。 – Aphillippe 2011-04-07 08:26:24

相關問題