我正在尝试创建一个连接三个内联表函数(SQL Server 2005)结果的select语句。前两个函数连接如下:
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秒,但这看起来很混乱。有没有办法强制优化器先运行三个表,然后加入?
非常感谢任何帮助。
答案 0 :(得分:1)
嗯,你实际上是这样做的:首先加入2个表,然后将得到的派生表加入到交换率udf中。这可能会使优化器按照您想要的方式工作。