【问题标题】:Performance of stored procedure vs scalar-valued function in Microsoft SQL ServerMicrosoft SQL Server 中存储过程与标量值函数的性能
【发布时间】:2010-05-28 21:35:02
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 不要低估查尔斯所说的。 UDF 很棒,但它们可能是一个巨大的、预期的性能瓶颈。
    【解决方案2】:

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

    另外,函数是否为 CLR 可以产生几个数量级的差异。

    【讨论】:

      猜你喜欢
      • 2011-05-14
      • 2010-11-13
      • 1970-01-01
      • 2011-05-25
      • 2016-04-14
      • 2018-12-06
      • 2015-04-18
      • 1970-01-01
      相关资源
      最近更新 更多