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

时间:2017-10-27 17:46:54

标签: sql sql-server performance user-defined-functions

  1. 我创建了一个获得最后一个工作日的UDF,它的运行时间不到1秒。
  2. SELECT BlackWidow.dbo.LastBusinessDay('2015-12-31',DEFAULT)
    
    1. 我还创建了一个返回表的UDF,它以1s运行。
    2. SELECT * 
      FROM  BlackWidow.dbo.TurnoverTradesMarketCapCountry ('2015-12-31', 50, 20, 50, 100000, 1000000000, 3, 'Brazil')
      
      1. 当我同时运行时,运行时间超过一分钟
      2. SELECT * 
        FROM  BlackWidow.dbo.TurnoverTradesMarketCapCountry (BlackWidow.dbo.LastBusinessDay('2015-12-31',DEFAULT), 50, 20, 50, 100000, 1000000000, 3, 'Brazil')
        
        1. 如果我运行如下代码,则只需1s
        2. 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中花费的时间多得多?

1 个答案:

答案 0 :(得分:0)

性能差异最可能的解释是SQL Server中的查询优化器无法正确估计第一个查询中的查询成本。优化器不知道函数的返回将提前是什么,因此在执行之前无法估计查询的适当成本。此限制意味着可以选择极差的查询计划来执行。

优化器评估第二个查询要容易得多,因为一旦分配了@date变量,查询优化器就能够以更经济的方式执行查询执行。

这些操作功能相同,但在SQL Server执行时它们并不完全相同。要确认您可以查看估计的查询执行情况,并查看SQL优化程序估计的成本差异。然后运行查询并查看实际的执行计划。即使功能上他们完成同样的事情,他们也不会是一样的。

相关问题