确定存储过程是否已缓存计划

时间:2015-09-01 18:39:39

标签: sql-server caching stored-procedures

我正在测试一个存储过程,看看SQL Server是否可以制定一个"缓存计划"为了它。 在这个存储过程中,它包含"动态sql"语法(使用" EXEC"),并假设sql server不会存储缓存计划。 我使用ADO.NET来调用这个存储过程,并在sql server中找到了结果。

下面的图片展示了我在" sys.dm_exec_cached_plans"中搜索的结果。执行存储过程后的表。

CachedPlan

这是否意味着正在为任何类似的搜索缓存此存储过程? 为什么没有" query_plan"结果中的值?

sql server是SQL 2014 Enterprise Edition。 谢谢。

1 个答案:

答案 0 :(得分:2)

如果希望动态sql重用缓存的执行计划,请使用sp_executesql,如果您阅读了sp_executesql的MSDN文档,则会明确指出sp_executesql可以重用执行计划而Exec / Execute不会。

sp_executesql还允许您参数化查询并保护您免受SQL注入攻击。

来自MSDN

  

要执行字符串,建议您使用sp_executesql   存储过程而不是EXECUTE语句。因为这个存储   procedure支持参数替换,sp_executesql更多   比EXECUTE多才多艺;并且因为sp_executesql生成执行   计划更可能被SQL Server重用,sp_executesql   比EXECUTE更有效。