加入3个快速udfs进行一次慢速查询

时间:2011-04-06 16:19:09

标签: sql sql-server sql-server-2005

我正在尝试创建一个连接三个内联表函数(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秒,但这看起来很混乱。有没有办法强制优化器先运行三个表,然后加入?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

嗯,你实际上是这样做的:首先加入2个表,然后将得到的派生表加入到交换率udf中。这可能会使优化器按照您想要的方式工作。