SQL执行计划缓存

时间:2012-01-24 20:15:36

标签: sql sql-server caching

我有一些关于Microsoft SQL Server 2008性能的问题,主要是关于执行计划。

根据MSDN,与直接SQL查询相比,存储过程具有更好的性能,因为:

  

数据库可以准备,优化和缓存执行计划,以便以后可以重复使用执行计划。

我的第一个问题是为什么会这样。我之前已经读过,当使用参数化查询(预处理语句)时,执行计划被缓存以用于具有可能不同值(执行上下文)的后续执行。存储过程是否仍然更有效?如果是这样,存储过程的执行计划是仅按需重新创建的,还是不太可能从缓存中清除?参数化查询是否被视为ad-hoc query,这意味着执行计划更有可能从缓存中清除?

另外,既然我还是这个领域的新手,我想知道是否有某些命令只适用于T-SQL。我有一个查询,在第一次运行中需要大约12秒才能完成,然后在Microsoft SQL Management Studio和ADO.NET中大约需要3秒钟。作为演示文稿的一部分,该查询应该是无效的。问题是,在我的查询中,我根据this articleCHECKPOINT同时使用DBCC DROPCLEANBUFFERSOPTION (RECOMPILE)。但是,至少这两个首先似乎没有区别,因为查询仍然需要3秒。我的猜测是,这是由于数据缓存没有被清除。任何想法为什么缓存似乎没有被清除,或任何想法为什么我的查询在第一次执行后明显更快?

这些是我现在想到的问题。

1 个答案:

答案 0 :(得分:3)

“存储过程是否仍会更高效?”:基本上没有。它节省很少。从性能的角度来看,您可以在应用程序中使用SQL文字(除非它们是巨大的)。 SQL Server会将您发送给它的字符串与缓存的计划完全匹配。

“我有一个查询需要大约12秒才能完成第一次运行然后大约3秒后”考虑到你清除了所有缓存,这可能是一个统计问题。 SQL Server在您第一次访问列时自动创建统计信息。我想这就是你曾经发生过的事情。尝试运行sp_updatestats(在清除缓存之前)。