存储过程和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()。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值