【发布时间】:2011-07-30 23:53:00
【问题描述】:
我正在尝试创建一个连接来自三个内联表函数 (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 秒,但这似乎很混乱。有什么办法可以强制优化器先跑三张表,再join?
任何帮助将不胜感激。
【问题讨论】:
标签: sql sql-server sql-server-2005