【问题标题】:Advantages of Userdefined functions over Stored Procedures用户定义函数相对于存储过程的优势
【发布时间】:2010-02-09 09:13:01
【问题描述】:

我对用户定义的函数有一些疑问。我想知道为什么/何时使用函数。

函数相对于存储过程的优势是什么?

通过谷歌搜索我看到文章建议:

  • 存储过程比函数更有优势。
  • 函数的错误处理有限
  • 函数不能使用临时表
  • 函数不能调用存储过程。

函数的唯一优点是我们可以将函数用作内联查询。

通过使用临时表,我可以通过存储过程获得相同的结果,但与存储过程相比,我需要知道在哪个场景中使用函数。 我需要知道为什么我们需要 UDf ,因为 UDF 提供的大部分功能都可以通过存储过程来完成。 谁能指导我。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    主要区别(优点)是可以内联调用函数,不像存储过程 例如

    SELECT dbo.fxnFormatName(FirstName, LastName) AS FormattedName
    FROM MyTable
    
    SELECT * 
    FROM dbo.fxnTableReturningFunction() x
    

    用户定义的函数可以返回 TABLE 类型的数据,然后可以在查询中调用该函数,如上所示。使用存储过程,您必须执行它并将结果存储到一个临时表中,以便进一步操作/查询结果集。

    另一方面,是的,您可以在函数中执行的操作受到限制。例如您不能使用动态 sql,并且在 SQL 2005 之前的版本中,您不能在函数中使用 GETDATE() 等非确定性函数。

    您可能想要使用函数的一个示例是将常见的“格式化”功能包装起来,如上面第一个示例所示 - 而不是在每个查询中重复将名字和姓氏格式化为一个的逻辑,您将它包装在一个函数中并在任何地方调用它。通常情况下,我建议将格式留给 UI,但这是一个简单的示例,说明您可能使用的位置/原因。

    此外,不必创建临时表来保存存储过程中的结果以便进一步查询它通常会更好。如果 sproc 更改并返回更多列,您还需要更改将结果加载到临时表中的所有位置,以将用于保存结果的表的模式与返回的新模式同步。函数方法没有这个问题,因为没有要维护的临时表。

    【讨论】:

    • 不太对。是否可以在函数中使用 GETDATE() 之类的东西取决于我们的 SQL Server 版本。
    【解决方案2】:

    共有三种类型的函数:标量、内联表和表值。一般来说,标量和表值函数会导致性能问题,因为查询优化器在优化这些函数的使用方面做得不是很好。不过Inline Table函数的性能还不错。

    这里有一个创建新类型标量函数的Connect请求:The Scalar Expression function would speed performance...

    我希望人们确实为那个投票,因为它允许查询优化器内联函数表达式并利用统计数据等,就像普通查询一样,它会大大提高性能。

    【讨论】:

      【解决方案3】:

      用户定义函数的主要“缺点”是每行都调用它们。因此,如果您在 SELECT 列表中有这样的功能并且您在更大的集合上进行操作,那么您的性能很可能会受到影响。

      【讨论】:

      • ...但是您甚至可以在 SELECT 子句中包含一个存储过程...如果不能,那么比较两者时这有什么缺点?
      【解决方案4】:

      Mysql存储过程的优点

      1. 多个应用程序在多个环境中运行,需要使用同一个数据库。通过使用存储过程,您可以使您的业务逻辑独立于编程语言。

      2. 当安全是主要关注点时,使用存储过程至关重要。通过数据库进行操作,您可以记录所有执行的操作。银行网站就是最好的例子。

      3. 如果您使用的是存储过程,那么您没有直接访问表的权限,这是保护数据和事务的另一种方法。

      4. 存储过程有时会提高应用程序的性能

      5. 如果您的应用程序很大或者您的数据库服务器位于远程系统上,那么通过使用存储过程,您可以减少数据库服务器和应用程序服务器之间的流量。

      6. 由于存储过程是在您的数据库服务器中编写的,应用程序分别调用它,因此可重用程度。

      【讨论】:

        猜你喜欢
        • 2010-12-18
        • 1970-01-01
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        • 2017-11-27
        • 2014-03-06
        • 2019-06-20
        • 1970-01-01
        相关资源
        最近更新 更多