存储过程是否比函数更快

时间:2009-12-30 09:44:32

标签: sql sql-server stored-procedures function

我目前正在使用存储过程,但我有很多这样的东西:

if ... begin select 'success' return end
if ... begin select 'notgood' return end
if ... begin select 'someelse' return end

所以我认为使用函数更好一点,但是函数和存储过程之间是否存在性能差异?

3 个答案:

答案 0 :(得分:1)

告诉您的方案的最佳方式是设置一些测试,运行它们并比较结果。这不是一个警察的答案:对自己进行测试确实是最好的方法。考虑到您的独特情况有很多因素 - 例如数据库平台,服务器硬件,网络延迟,业务/客户端应用程序层,不同时间的服务器/网络负载等

答案 1 :(得分:1)

功能的使用方式和位置很重要。例如,从SELECT语句的WHERE子句调用的函数可以是性能杀手。我们曾经有过类似的声明:

SELECT * FROM TRANSACTIONS T
  WHERE IS_UGLY_TRANSACTION_CODE(T.TRANSACTION_CODE) = 'T' AND ...

整个过程运行速度太慢,安装日期过得太快,所以我开始检测代码以确定时间的进展。当我收到分析报告时,我查看了它,看到该作业处理了1000个事务,然后注意到IS_SALES_TRANSACTION被调用了大约五十万次。经过一番思考和对语句执行计划的一些研究后,我意识到有问题的例程被数据库用作查询中的主要过滤器,这导致了两件坏事:首先,存在查询中的例程阻止使用索引,因此查询正在扫描表,其次,在扫描期间为表中的每一行调用例程。使用TRANSACTION_CODE列上的等效检查替换函数调用会将运行时间从15分钟减少到5秒。

答案 2 :(得分:0)

通常,不同平台之间应该没有太大区别(我假设您在这里指的是SQL Server),因为它应该是相同的操作;查找存储过程/函数,必要时编译等等。

我知道SQL Server中的函数可以在CREATE FUNCTION语句中声明SCHEMABINDING,这将为您带来一些性能提升,代价是在创建函数时锁定到模式。