0

我编写了一个复杂的查询,它将返回一个 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 的结果时,我看不出两者之间的显着差异。但在实际实现中,结果可能是一百万行。

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

4

2 回答 2

2

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

用户定义的函数可能很方便,但有时也会导致性能下降。它们的问题是它们使用类似于游标的逐行处理,而不是基于集合的操作。所以如果你的查询结果集,那么对性能的影响会很小。但是如果结果集很大,那么性能很可能会成为一个问题。一般来说,如果您使用的是用户定义的函数,您会希望避免将它们用于大型结果集。请改用存储过程。

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

于 2009-10-03T09:52:27.537 回答
0

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

SELECT MYTABLE.MYFIELD FROM MYTABLE, DBO.UDF_COMPLEX(@PARAM1,@PARAM2...@@PARAMN) MYQUERY
WHERE MYTABLE.KEYVALUE = MYQUERY.KEYVALUE
于 2009-10-06T09:34:24.173 回答