在TSQL中,查询语句编译时并不为变量赋值(SET OR SELECT Operation),即变量赋值在编译完成,语句执行时才执行赋值操作,因此查询优化器不一定能为查询语句生成一个合适的执行计划
ex:
DECLARE @Id INT =100; SELECT * FROM dbo.Users WHERE UserId>@Id
可以使用以下几种方式修改:
--===================================================== DECLARE @Id INT =100; SELECT * FROM dbo.Users WHERE UserId>@Id OPTION(RECOMPILE) --===================================================== DECLARE @Id INT =100; SELECT * FROM dbo.Users WHERE UserId>@Id OPTION(RECOMPILE(@ID=2)); --===================================================== SP_EXECUTESQL ' SELECT * FROM dbo.Users WHERE UserId>@Id',N'@Id INT',@ID=100 --===================================================== CREATE PROCEDURE dbo.usp_GetUser ( @ID INT ) AS BEGIN SELECT * FROM dbo.Users WHERE UserId>@Id END GO EXEC dbo.usp_GetUser @ID=100 --=====================================================
存储过程在首次执行时进行编译并缓存以便后续重复调用
ps:此文章参照'大材小用'博客http://www.cnblogs.com/slade/archive/2012/04/29/2476463.html#2367297