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