最近公司服务器cpu一直很高,没有发现死锁信息,经检查,发现开发人员都是直接拼sql,因此数据库很少重复利用执行计划,大量的编译消耗很多cpu,所以建议使用参数化查询和存储过程,但老大要求能证明存储过程确实比拼sql性能要好才会修改代码,因此写了如下代码做说明(此类代码很多,在此只是做下记录,以鼓励自己以后多写博客)
1.首先建立一张空表(在此是copy现有的表结构)
2.分别实现了4个简单的存储过程
4.查看缓存信息,并比较
--Version
Microsoft sql Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 copyright (c) 1988-2008 Microsoft Corporation Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
select top 100 * into __WOSN from WO_SN select * from __WOSN go create procedure __usp_cache_1 ( @sn varchar(30) ) as begin select top 1000 * from __WOSN where SN=@sn end go create procedure __usp_cache_2 ( @sn varchar(30) ) as begin declare @sql varchar(1000) set @sql='select top 1000 * from __WOSN where SN='''+@sn+'''' exec(@sql) end go create procedure __usp_cache_3 ( @sn varchar(30) ) as begin declare @sql nvarchar(1000) set @sql='select top 1000 * from __WOSN where SN='''+@sn+'''' exec sp_executesql @sql end go create procedure __usp_cache_4 ( @sn varchar(30) ) as begin declare @sql nvarchar(1000) set @sql='select top 1000 * from __WOSN where SN='''+@sn+'''' exec sp_sqlexec @sql end go select top 1000 * from __WOSN where SN='0001' select top 1000 * from __WOSN where SN='0002' select top 1000 * from __WOSN where SN='0003' exec __usp_cache_1 '0004' exec __usp_cache_1 '0005' exec __usp_cache_1 '0006' exec __usp_cache_2 '0007' exec __usp_cache_2 '0008' exec __usp_cache_2 '0009' exec __usp_cache_3 '0010' exec __usp_cache_3 '0011' exec __usp_cache_3 '0012' exec __usp_cache_4 '0013' exec __usp_cache_4 '0014' exec __usp_cache_4 '0015'
SELECT b.text,a.* FROM sys.dm_exec_cached_plans a CROSS APPLY sys.dm_exec_sql_text(a.plan_handle) b where b.text like '%100%WOSN%' or b.text like '%__usp_cache_%'
结果如下:
从上面结果可以看出执行存储过程__usp_cache_1的时候它的执行计划被重复利用了(因为没有出现'0004','0005','0006'),而其他的则没有;特别是对于动态sql的存储过程,它的效果跟直接执行sql是一样的,对于每一个参数都需要编译执行计划,并不能重复利用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。