用户定义函数优于存储过程的优点

时间:2010-02-09 09:13:01

标签: sql sql-server

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

函数优于存储过程有什么优势?

通过谷歌研究我看过文章暗示:

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

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

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

4 个答案:

答案 0 :(得分:2)

主要区别(优点)是您可以调用函数内联,而不像存储过程 e.g。

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

SELECT * 
FROM dbo.fxnTableReturningFunction() x

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

另一方面,是的,你在一个功能中可以做什么是有限的。例如你不能使用动态sql和pre-SQL 2005,你不能在函数中使用像GETDATE()这样的非确定性函数。

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

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

答案 1 :(得分:2)

有三种类型的函数:标量,内联表和表值。一般来说,Scalar&表值函数可能会导致性能问题,因为查询优化器在优化使用这些类型的函数时效果不佳。但是,内联表功能的表现还不错。

在此处有一个Connect请求可以创建一种新的标量函数:The Scalar Expression function would speed performance...

我希望人们投票支持那个,因为它可以通过允许查询优化器内联函数表达式并利用统计信息等来提高性能,就像正常查询一样。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

Mysql存储过程的优点

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

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

  3. 如果您使用的是存储过程,则表示您没有直接访问表格,这是保护数据和交易的另一种方法。

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

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

  6. 由于存储过程是在数据库服务器中编写的,因此应用程序会将其重新调用,然后再重新使用。