2011-04-06 40 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