Microsoft SQL Server中存储过程与标量值函数的性能

时间:2010-05-28 13:29:03

标签: sql-server-2005 sql-server-2008

我想知道存储过程和标量值函数之间的性能差异。现在我主要使用标量值函数,因为我可以在其他查​​询中使用它们(并且99%的时间它们总是返回1个值)。 但是有一些标量值函数,我从来没有在其他查询中使用过,通常我用简单的SELECT dbo.somefunction(参数)调用它们就是这样。

从性能的角度来看,将它们迁移到存储过程会更好吗?

2 个答案:

答案 0 :(得分:7)

每次调用标量值函数时都会重新编译它们。这是因为它们不能包含在由查询优化器/处理器处理的sql创建的计划缓存中。

对于你只调用udf一次的情况(如在Select dbo.UDFName(params)中),它实际上并不重要,但如果你在查询一百万行的查询中使用标量值udf,那么udf将会被编译一百万次。这肯定会受到性能影响。有一种技术(如果算法可以在基于集合的结构中编写),您可以将标量UDF转换为所谓的表值内联udfs,返回一行/一列表...这些可以是包含在sql查询计划缓存以及其余的sql中,因此它们不受此性能影响......

答案 1 :(得分:2)

这里没有绝对的,魔鬼在细节中。最好的方法是通过检查查询计划和统计信息来测试给定的情况。

此外,该功能是否为CLR可以产生几个数量级的差异。