存储过程和T-SQL语句的执行计划重用性比较

存储过程和T-SQL的区别是服务器端是否会对执行计划进行缓存,即每次是否都需要对于要执行的内容重新编译,这不仅仅取决于是存储过程还是T-SQL,还取决于你语句中对参数的使用方式。
示例如下:
1、直接使用T-SQL语句
 select top 100 * from A
 where month_id=200901

month_id值发生变化时,需要重新编译。

2、直接使用的常量参数
CREATE  PROC P_Exec1
@month_id INT
AS
 select top 100 * from A
 where month_id=@month_id

--EXEC P_Exec 200902
执行计划被缓存,参数值发生变化时,不需要重新编译。

3、使用EXEC执行动态定义的T-SQL语句
DECLARE @month_id INT
DECLARE @sql VARCHAR(4000)

SET @month_id=200901
SET @sql=' select top 100 * from A
where month_id='+CAST(@month_id AS VARCHAR)
EXEC (@sql)

@month_id值发生变化时,需要重新编译。

4、使用sp_executesql执行动态定义的T-SQL语句
EXEC sp_executesql
N' select top 100 * from A
where month_id=@month_id',
N'@month_id int',@month_id=200901

执行计划被缓存,参数值发生变化时,不需要重新编译。

5、将动态定义的T-sql语句放入存储过程
CREATE  PROC P_Exec
@month_id INT
AS
DECLARE @sql VARCHAR(4000)
SET @sql=' select top 100 * from A
where month_id='+CAST(@month_id AS VARCHAR)
EXEC (@sql)

--EXEC P_Exec 200901

@month_id值发生变化时,需要重新编译。

具体的测试数据请自行创建。

结论:考虑到查询计划的重用性,相同定义的存储过程优于查询语句,sp_executesql优于exec()。

 

你可能感兴趣的:(存储过程和T-SQL语句的执行计划重用性比较)