【问题标题】:Joining 3 fast udfs to make one slow query加入 3 个快速 udf 以进行一个慢速查询
【发布时间】: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


    【解决方案1】:

    好吧,您实际上是这样尝试的:首先连接 2 个表,然后将生成的派生表连接到 exchangeates udf。这可能会使优化器按您想要的方式工作。

    【讨论】:

    • 谢谢,效果很好。将执行时间缩短至 3 秒。换一种思路,这会是使用 CTE 的地方吗?我对它们了解不多,但看起来大致相似。
    猜你喜欢
    • 2012-07-28
    • 2018-06-25
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多