前言:

  在第一次执行查询或者存储过程时,会创建执行计划并存储在SQLServer的过程缓存内存中。在很多时候,我们会执行一些简单的程序,仅仅执行一次,而为这些查询创建存储过程是非常浪费内存资源的。由于内存不足,可能会导致你的缓存溢出,从而影响性能。在2005之前,这是一个大问题,为了纠正这个问题。微软在SQLServer 2008中引入了对即时查询负载的优化功能。这个功能在2012也依旧可用。是基于实例级别的。

  很多开发人员直接在生产环境运行和测试查询,如果没有得到期望的结果,会更改查询然后再次执行,这会对过程缓存造成很大压力。所以尽量不要这样做。

  准备工作:

  在开始之前,在测试服务器清空缓存,但是切记不要在生产环境这样做:

  1、先看看有多少数据保存在缓存中:

SELECT  CP.usecounts AS CountOfQueryExecution ,
        CP.cacheobjtype AS CacheObjectType ,
        CP.objtype AS ObjectType ,
        ST.text AS QueryText
FROM    sys.dm_exec_cached_plans AS CP
        CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS ST
WHERE   CP.usecounts > 0
GO

  结果如下:

  2、清空缓存和缓冲池:

DBCC FREEPROCCACHE
GO

  3、如果想检查是否清空成功,可以再次执行步骤1中的语句:

  步骤:

  1、执行下面语句:

USE AdventureWorks
GO
SELECT  *
FROM    Sales.SalesOrderDetail
WHERE   SalesOrderDetailID = 43659
GO

  2、检查在运行了上面语句后是否有计划缓存,再次执行之前查询计划缓存的语句:

SELECT  CP.usecounts AS CountOfQueryExecution ,
        CP.cacheobjtype AS CacheObjectType ,
        CP.objtype AS ObjectType ,
        ST.text AS QueryText
FROM    sys.dm_exec_cached_plans AS CP
        CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS ST
WHERE   CP.usecounts > 0
GO