DBCC FREEPROCCACHE –清除执行计划缓存
1. 使用存储过程,或者 sp_executesql 的方式调用会被重复使用的语句,而不要直接用 ad-hoc 语句或者 dynamic SQL 。
2. 在语句里引用对象(表、视图、存储过程等),到带上它的 schema 名字,而不光是对象自己的名字。
3. 将 数据库 Parameterization 属性设置成 Forced
这个属性是开启数据库强制参数化。也就是说,对于在这个数据库下运行的大部分语句,SQL Server 都会先参数化,再运行。如果应用经常用 adhoc 的方式调用一样的语句,强制参数化可能会有所帮助
4. 统计信息更新
统计信息手工或者自动更新后,对和它有关的执行计划都不再能重用,而会产生重编译。
5. Create Procedure ... with Recompile 选项 和 Exce ... with Recomplie 选项
在重建或者调用存储过程的时候使用 "with Recomplie",会强制 Sql Server 在调用这个存储过程的时候,永远都要先编译,再运行。
6. 用户使用了 sp_recomplie
7. 用户在调用语句的时候,使用了 "Keep Plan" 或者 "KeepFixed Plan" 这样的查询提示
```declare @p1 int
exec sp_prepexec @p1 output,N'@P0 bigint',N'select top 1 r.reser_no,r.card_no,r.op_date,r.payment,r.order_from
from reserve r with(nolock)
where r.card_no = @P0 and r.reser_status!=''ERR''
order by r.op_date; ',190000000048182868
select @p1