【问题标题】:SQL Server StoredProc vs UDF inline tableSQL Server StoredProc 与 UDF 内联表
【发布时间】:2009-10-03 08:55:15
【问题描述】:

我编写了一个复杂的查询,它将返回一个 ID 列表。现在我想重新使用这个查询,以便将结果与另一个查询连接起来。为此,我计划将其放入存储过程或 UDF 中,然后使用它插入临时表中。

类似下面的东西

1) 将查询放入存储过程并插入到临时表中

INSERT INTO #TEMP
EXEC SP_COMPLEX(@PARAM1,@PARAM2...@@PARAMN)

2) 将查询放入 UDF 并插入到临时表中

INSERT INTO #TEMP
SELECT ID_LIST FROM DBO.UDF_COMPLEX(@PARAM1,@PARAM2...@@PARAMN)

当我针对 1000 个 ID 运行它们时,我看不出两者之间的显着差异。但在实际实现中,结果可能是一百万行。

对于性能来说,哪一个会更好?

【问题讨论】:

    标签: sql-server stored-procedures inline user-defined-functions


    【解决方案1】:

    我建议您比较两种技术的执行计划,而不是猜测。

    用户定义的函数可以是 方便,他们有时也可以 导致性能受损。这 他们的问题是他们使用 逐行处理,类似于 游标,而不是基于集合的 手术。所以如果结果集 您的查询,然后是性能 影响会很小。但如果 结果集很大,然后性能 很可能会成为一个问题。 一般来说,如果您使用的是 用户定义的函数,你会想要 避免使用它们产生大的结果 套。请改用存储过程。

    提高标量值用户定义函数性能的一种方法是将它们转换为表值函数。

    【讨论】:

      【解决方案2】:

      我发现使用内联表值函数并直接加入它是比我在问题中提出的选项更好、更有效的选择。 类似的东西

      SELECT MYTABLE.MYFIELD FROM MYTABLE, DBO.UDF_COMPLEX(@PARAM1,@PARAM2...@@PARAMN) MYQUERY
      WHERE MYTABLE.KEYVALUE = MYQUERY.KEYVALUE
      

      【讨论】:

      • 下面的语法其实效率很低 INSERT INTO #TEMP EXEC SP_COMPLEX(@PARAM1,@PARAM2...@@PARAMN)
      猜你喜欢
      • 2010-12-04
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      相关资源
      最近更新 更多