MSSQL中内联函数和表值函数在编译生成执行计划的区别
Tags: 编译SQL ServerMSSQL执行计划
最近在学习 WITH RECOMPILE和OPTION(RECOMPILE)在重编译上的区别的时候,无意中发现表值函数和内联表值函数编译生成执行计划的区别
下文中将会对此问题展开讨论。
简单地说就是:同样一句SQL,分别写成内联函数和表值函数,然后执行对Function的查询,发现其执行计划和执行计划缓存是不一样的,
根据某些测试的一些共同规律发现,内联函数的编译很有可能与Parameter Embedding Optimization 有关
关于Parameter Embedding Optimization,我在http://www.cnblogs.com/wy123/p/6262800.html写了一个案例
在发生Parameter Embedding Optimization做编译优化的时候,跟普通的编译优化机制还是有很大差异的。
概念解释:内联用户定义函数和表值用户定义函数
SQL Server中的表值函数分为“内联用户定义函数”和“表值用户定义函数”。
内联用户定义函数(Inline User-Defined Functions):
不上MDSN上搬概念了,简单地说,内联函数的特点就是就是返回类型为table,返回的结果是一个查询语句
如下,dbo.fn_InlineFunction即为内联用户定义函数,当然后面要与表值用户定义函数作比较,就能看出来区别了
1 2 3 4 5 6 7 8 9 10 11 12 13 | create function dbo.fn_InlineFunction ( @p_parameter varchar(500) ) returns table as return ( SELECT id,col2 FROM [dbo].[TestTableValueFunction] where ( col2 = @p_id or @p_id is null) ) GO |
表值用户定义函数(Table-Valued User-Defined Functions),
与内联函数区别在于,表值用户定义函数返回的是一个表变量,在函数体中,通过赋值给这个表变量,然后返回表变量
如下dbo.fn_TableValuedFunction即为内联用户定义函数,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | create function fn_TableValuedFunction ( @p_paramter varchar(500) ) RETURNS @Result TABLE ( id int , value char(5000) ) as begin insert into @Result select id,col2 from [dbo].[TestTableValueFunction] where ( col2 = @p_id or @p_id is null) return end |