【发布时间】:2018-04-09 09:33:16
【问题描述】:
- 我创建了一个获取最后一个工作日的 UDF,它在不到 1 秒的时间内运行。
SELECT BlackWidow.dbo.LastBusinessDay('2015-12-31',DEFAULT)
- 我还创建了一个返回表的 UDF,它在 1 秒内运行。
SELECT *
FROM BlackWidow.dbo.TurnoverTradesMarketCapCountry ('2015-12-31', 50, 20, 50, 100000, 1000000000, 3, 'Brazil')
- 当我同时运行两者时,运行时间超过一分钟
SELECT *
FROM BlackWidow.dbo.TurnoverTradesMarketCapCountry (BlackWidow.dbo.LastBusinessDay('2015-12-31',DEFAULT), 50, 20, 50, 100000, 1000000000, 3, 'Brazil')
- 如果我运行如下代码,只需要 1 秒
DECLARE @date as DATETIME
SET @date=BlackWidow.dbo.LastBusinessDay('2015-12-31',DEFAULT)
SELECT *
FROM BlackWidow.dbo.TurnoverTradesMarketCapCountry (@date, 50, 20, 50, 100000, 1000000000, 3, 'Brazil')
任何建议为什么在案例 3 中比在案例 4 中花费更多时间?
【问题讨论】:
-
SQL 在后台进行了大量优化。它可能允许通过将函数从参数中取出来进行额外的优化。与现在一样,它具有难以解决的价值。
-
这两个执行计划是什么?
-
在场景 3 中,标量 UDF 会导致 RBAR,并且可能会导致一些其他性能问题。 - When is a SQL function not a function? "If it’s not inline, it’s rubbish." - Rob Farley
标签: sql sql-server performance user-defined-functions