Sql server 在SQL Server中使用用户定义函数是否有充分的理由?

Sql server 在SQL Server中使用用户定义函数是否有充分的理由?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,随着时间的推移,SQL Server已经缩小了UDF和存储过程之间的差距。很多时候,你使用其中一个是正确的。经验法则是函数做一件特定的事情(getdate()),而过程通常一次做多件事情,复杂的业务逻辑(sp_addarticle) 我们的开发团队已经创建了数百个函数,它们确实会导致性能问题。无论函数返回多少行,执行计划都将它们视为返回一行。这导致了性能问题。每当遇到瓶颈时,我们只需将函数转换为proc!这种做法正在成为一种趋势 我知道无论走哪条路都有利弊。我有几个问题: 把我们所有的函数转换

随着时间的推移,SQL Server已经缩小了UDF和存储过程之间的差距。很多时候,你使用其中一个是正确的。经验法则是函数做一件特定的事情(getdate()),而过程通常一次做多件事情,复杂的业务逻辑(sp_addarticle)

我们的开发团队已经创建了数百个函数,它们确实会导致性能问题。无论函数返回多少行,执行计划都将它们视为返回一行。这导致了性能问题。每当遇到瓶颈时,我们只需将函数转换为proc!这种做法正在成为一种趋势

我知道无论走哪条路都有利弊。我有几个问题:

  • 把我们所有的函数转换成过程有什么负面影响吗? (这将是一项艰巨的任务!但我们可能不得不咬紧牙关 子弹。)

  • 是否只有在功能上才能实现什么?)我知道 有些事情只有自定义项才能做。例如,您可以在 选择,或者函数可以在默认值中引用。我不寻找 这样的事情。)

  • 数据库中的UDF最大数量是多少?(刚刚 好奇。)


    • 这是一个复杂的问题,没有精确的答案(也许你应该在Quora上发布),但我会尝试

    • 除了你不能
      从MyStoredProcess中选择*之外,我看不到任何负面影响。。。另一方面,您可能会获得安全性,因为SP必须由
      EXEC mySP
      调用,而USF不能调用,因此如果一个开发人员将USF命名为“LastYearOrders”,另一个开发人员可能会将其称为表。。。这也让一个疯狂的工作变得容易一些
    • 我不这么认为
    • 我没有

    • 一个原因是能够在计算列中使用自定义项。我想另一个是使用标量值函数的能力


      批量转换所有UDF听起来像是下意识的反应。您是否确定了性能问题的根本原因?是否有比存储过程更适合作为UDF的UDF?

      这个问题中的一些确实转向了大量基于意见的信息,但我想说的是(尽量远离个人意见):

    • 消极的一面是这是一项艰巨的任务;)
    • 不可以。存储过程可以完成函数所能做的一切,甚至更多。此时,用户定义函数实际上可以看作是存储过程的子集
    • 我找不到绝对最大值是多少,但我尽量避免使用函数,因为它们很容易出错和使用不当(以牺牲性能的方式)

    • 顺便提一下,您是否尝试过在函数定义中使用
      和SCHEMABINDING
      ?如果适用的话,这有助于提高性能。

      我倾向于说,您应该将UDF降级到只能通过这种方式完成的作业,甚至可以重新组织查询,以避免在可能的情况下依赖UDF。此外,一些任务首先属于客户端程序而不是数据库中,当然,应该考虑摆脱那些仅用于此类任务的UDF,以及这些任务本身。我不记得曾经使用过一个拥有多于一部分UDF的DB。另一方面,我曾与一些SP装载量很大的公司合作过。标量和多语句UDF是个坏消息,请远离它们,但内联UDF是您的朋友,您可以随时使用它们:)我认为UDF是最后的选择。几乎在任何情况下,当我可以选择使用UDF时,我都可以使用视图或存储过程找到更好的解决方案。我会首先找到最大的性能破坏因素,并在提交到heruclean任务之前修复它们。使用UDF可以做的事情(据我所知)是在查询中内联使用它们。谢谢JP。我同意计算列(计算列?)和内联函数。我们案例中的根本原因是执行计划错误地认为函数返回一行。当我们将函数代码转换为常规t-sql或proc时,我们会看到更好的性能。