【问题标题】:Why is an SQL function taking so long when using variables为什么使用变量时 SQL 函数需要这么长时间
【发布时间】:2021-11-13 21:28:33
【问题描述】:

我有一个 SQL 函数,如果我按照以下代码执行该函数,它会在 11 秒内返回结果。

SELECT * 
FROM MyFunction('param1', 'param2', 'param3', 'param4', 'param5')

但是如果我按照以下方式执行函数,它会在 40 秒内返回结果。

DECLARE 
    @PARAM1 NVARCHAR(4), 
    @PARAM2 NVARCHAR(3), 
    @PARAM3 NVARCHAR(3), 
    @PARAM4 NVARCHAR(10), 
    @PARAM5 NVARCHAR(10)

SET @PARAM1 = 'param1'
SET @PARAM2 = 'param2'
SET @PARAM3 = 'param3'
SET @PARAM4 = 'param4'
SET @PARAM5 = 'param5'

SELECT * 
FROM MyFunction(@PARAM1, @PARAM2, @PARAM3, @PARAM4, @PARAM5) 

相同的参数值和相同的结果返回,但为什么使用变量需要这么长时间?

【问题讨论】:

  • 递归,还有更多递归要做吗?由于没有FUNCTION 的定义,我们只能猜测。
  • edit问题并添加函数定义,以及任何相关的表和索引定义。另请通过brentozar.com/pastetheplan 分享查询计划的链接
  • @DaleK 它很容易成为动态切片取出 case 表达式的整个部分或整个连接的结果,这只能用文字来完成

标签: sql sql-server tsql sql-server-2016


【解决方案1】:

我不确定参数嗅探或编译器快捷方式是否适用于用户定义的函数。

但是,对于您的示例代码,参数是不同的。这段代码:

DECLARE 
    @PARAM1 NVARCHAR(4), 
    @PARAM2 NVARCHAR(3), 
    @PARAM3 NVARCHAR(3), 
    @PARAM4 NVARCHAR(10), 
    @PARAM5 NVARCHAR(10)

SET @PARAM1 = 'param1'
SET @PARAM2 = 'param2'
SET @PARAM3 = 'param3'
SET @PARAM4 = 'param4'
SET @PARAM5 = 'param5'

实际上是要生成值:

SET @PARAM1 = 'para'
SET @PARAM2 = 'par'
SET @PARAM3 = 'par'
SET @PARAM4 = 'param4'
SET @PARAM5 = 'param5'

因为参数声明的长度。

如果这发生在你的实际代码中,那么性能就会不同,因为参数不同。

【讨论】:

  • 对不起我的代码示例。这是参数嗅探错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多