前言:
在第一次执行查询或者存储过程时,会创建执行计划并存储在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 |