我对用户定义的函数有一些疑问 . 我想知道为什么/何时使用函数 .
函数优于存储过程有什么优势?
通过谷歌研究我看到文章暗示:
-
存储过程比函数更有利 .
-
函数的错误处理有限
-
函数不能使用临时表
-
函数无法调用存储过程 .
函数的唯一优点是我们可以使用函数作为内联查询 .
通过使用临时表,我可以使用存储过程获得相同的结果,但我需要知道与存储过程相比使用函数的场景 . 当UDF提供的大多数功能都可以通过存储过程完成时,我需要知道为什么我们需要UDf . 任何人都可以指导我这个 .
4 回答
用户定义函数的主要“缺点”是为每一行调用它们 . 因此,如果您在SELECT列表中有这样的功能并且您在更大的集合上运行,那么您的性能很可能会受到影响 .
主要区别(优点)是您可以调用函数内联,这与存储过程不同,例如
用户定义的函数可以返回TABLE类型数据,然后可以在查询中调用该函数,如上所示 . 使用sproc,您必须执行它并将结果存储到临时表中,然后进一步操作/查询结果集 .
另一方面,是的,你在一个功能中可以做什么是有限的 . 例如你不能使用动态sql和pre-SQL 2005你不能在函数中使用像GETDATE()这样的非确定性函数 .
您可能想要使用函数的一个示例是包含常见的“格式化”功能,如上面的第一个示例所示 - 而不是重复逻辑以将每个查询中的名字和姓氏格式化为一个,将其包装在一个功能,并呼吁到处 . 通常我建议将格式保留到UI,但这是一个简单的示例,说明您可以使用的位置/原因 .
此外,不必创建临时表来保存sproc的结果以便进一步查询它通常更好 . 如果sproc更改并返回更多列,则还需要更改将结果加载到临时表的任何位置,以同步其用于保存结果的表表的模式以及返回的新模式 . 函数方法没有这个问题,因为没有要维护的临时表 .
有三种类型的函数:标量,内联表和表值 . 一般来说,标量和表值函数可能会导致性能问题,因为查询优化器在优化这些类型的函数的使用方面做得不好 . 但是,内联表功能的表现还不错 .
这里有一个Connect请求来创建一种新的标量函数:The Scalar Expression function would speed performance...
我希望人们会为那个投票,因为它可以通过允许查询优化器内联函数表达式并利用统计信息等来提高性能,就像对普通查询一样 .
Mysql存储过程的优点
多个应用程序在多个环境中运行,需要使用相同的数据库 . 通过使用存储过程,您可以使您的业务逻辑独立于编程语言 .
当安全性是主要问题时,使用存储过程至关重要 . 通过数据库执行操作,您可以记录所有执行的操作 . 银行网站就是最好的例子 .
如果您正在使用存储过程,那么您没有直接访问表,这是保护数据和事务的另一种方法 .
存储过程有时会提高应用程序的性能
如果您的应用程序很大或您的数据库服务器在远程系统上,那么通过使用存储过程可以减少数据库服务器和应用程序服务器之间的流量 .
由于存储过程是在数据库服务器中编写的,因此应用程序会将其重新调用,然后再重新使用 .