日期:2014-05-17  浏览次数:20840 次

存储过程 函数 预编译
书本上,网络上一直在强调存储过程有预编译,执行起来会比单独的SQL语句快,这个好理解。
那自定义函数呢?网上有说它有预编译,有说它没有预编译的。书本上也没有给出一个明确的说法。
在下初学SQLserver不清楚到底是怎么一个情况。想请教一下大家。

------解决方案--------------------
Select Newid();
GO
Create function dbo.fn(@n int)returns int/*C51634A6-6FA3-45FF-BA76-EC82CEB6A498*/
as
Begin
return @n+1;
End
Select *
From sys.syscacheobjects
Where sql like '%C51634A6-6FA3-45FF-BA76-EC82CEB6A498%'

select dbo.fn(number) as vl
From master..spt_values
Where type = 'P'
And number < 11
---------------------------------------
11074 Compiled Plan Proc 539148966 12 12 1 2 3 2 4347 30 3 0 0 0 0 0 0 216 Create function fn(@n int)returns int/*C51634A6-6FA3-45FF-BA76-EC82CEB6A498*/  as  Begin   return @n+1;  End
14500 Compiled Plan Adhoc 719910009 12 0 -2 2 4 45 4347 30 3 0 0 0 0 0 0 182 Select *  From sys.syscacheobjects  Where sql like '%C51634A6-6FA3-45FF-BA76-EC82CEB6A498%'

我觉得大家之所以喜欢存储过程是因为他的缓存执行计划吧。
我简单测试了一下,函数也是会缓存执行计划的,实际上MsSqlserver所有的查询好像都会缓存执行计划,只是复用的程度不同吧。
但是函数相比存储过程有许多限制,比如说不能修改表,不能使用有副作用的函数,但是函数明显的好处就是它几乎能出现在查询的任何位置。比如Select、Where、等等。
个人理解。

------解决方案--------------------
应该一分为二的来看问题了,有些自定义函数的确可以提高效率,但不是全部的有些是用表关联会更快,须具体问题具体分析了