SQL Server StoredProc 与 UDF 内联表

Posted

技术标签:

【中文标题】SQL Server StoredProc 与 UDF 内联表【英文标题】:SQL Server StoredProc vs UDF inline table 【发布时间】: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 运行它们时,我看不出两者之间的显着差异。但在实际实现中,结果可能是一百万行。

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

【问题讨论】:

【参考方案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)

以上是关于SQL Server StoredProc 与 UDF 内联表的主要内容,如果未能解决你的问题,请参考以下文章

从 SQL Server 存储过程中获取结果

与 SQL Server 联合的分页

直接在数据库上从 python 执行 SQL Server 存储过程

SQL Server 错误“命名管道提供程序:无法打开与 SQL Server [53] 的连接”

将编译好的 Linq To SQL 与 ExecuteMethodCall 一起使用

将 SQL Server CE 数据库与常规 SQL Server 数据库同步