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秒,但這似乎很混亂。有沒有辦法強制優化器先運行三個表,然後加入?
任何幫助將不勝感激。
謝謝,這工作完美。執行時間縮短至3秒。在不同的方面,這是否會成爲使用CTE的地方?我對他們真的不是很瞭解,但看起來大致相似。 – Aphillippe 2011-04-07 08:26:24