gpt4 book ai didi

子查询与声明中的 SQL UDF 速度

转载 作者:行者123 更新时间:2023-12-04 01:14:06 25 4
gpt4 key购买 nike

  1. 我创建了一个 UDF,它可以获取最后一个工作日并且运行时间不到 1 秒。
SELECT BlackWidow.dbo.LastBusinessDay('2015-12-31',DEFAULT)
  1. 我还创建了一个返回表并​​在 1 秒内运行的 UDF。
SELECT * 
FROM BlackWidow.dbo.TurnoverTradesMarketCapCountry ('2015-12-31', 50, 20, 50, 100000, 1000000000, 3, 'Brazil')
  1. 当我同时运行两者时,运行时间超过一分钟
SELECT * 
FROM BlackWidow.dbo.TurnoverTradesMarketCapCountry (BlackWidow.dbo.LastBusinessDay('2015-12-31',DEFAULT), 50, 20, 50, 100000, 1000000000, 3, 'Brazil')
  1. 如果我运行如下代码,只需要 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 Server 中的查询优化器无法正确估计第一个查询中的查询成本。优化器提前不知道函数的返回值,因此无法在执行前为查询估计适当的成本。此限制意味着可能会选择极差的查询计划来执行。

第二个查询对于优化器来说更容易评估,因为一旦分配了@date 变量,查询优化器就能够以更经济的方式计算查询执行的成本。

这些操作在功能上是相同的,但当涉及到 SQL Server 执行时,它们在字面上并不相同。要确认,您可以查看估计的查询执行并查看 SQL 优化器估计成本的差异。然后运行查询并查看实际的执行计划。即使在功能上它们完成相同的事情,它们也不相同。

关于子查询与声明中的 SQL UDF 速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46980782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com