配置SQL??配置“对即时负载的优化”
作者:网络转载 发布时间:[ 2013/4/22 11:39:08 ] 推荐标签:
8、你会发现里面没有数据,现在再次执行下面语句:
USE AdventureWorks
GO
SELECT *
FROM Sales.SalesOrderDetail
WHERE SalesOrderDetailID = 43659
GO
9、使用以下查询检查:
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
AND ST.text LIKE '%SELECT * FROM Sales.SalesOrderDetail WHERE SalesOrderDetailID = 43659 %'
AND CP.cacheobjtype = 'Compiled Plan'
GO
10、这次出现了下面的截图:

分析:
当新查询执行时,query_hash值会在内存中生成,而不是整个执行计划,当相同的查询第二次执行的时候,SQLServer会查找是否已经存在这个query_hash,如果不存在,执行计划将保存在缓存中。这样使得仅执行一次的查询将不会保存执行计划到缓存中。所以强烈建议打开这个配置。这个配置不造成任何负面影响,但是可以节省计划缓存的空间。
一般情况下,当你执行查询,将会产生执行计划并保存在过程缓存中,所以当你执行步骤1的查询是,会看到服务器有很多计划缓存,但是当执行第六步后的查询是,发现没有。对于即席查询,如果只执行一次,何必需要缓存呢?
有些系统的计划缓存达到GB以上,开启后可能减少一半空间。另外,如果你好奇即席查询占用了多少空间,可以使用下面的语句:
SELECT SUM(size_in_bytes) AS TotalByteConsumedByAdHoc
FROM sys.dm_exec_cached_plans
WHERE objtype = 'Adhoc'
AND usecounts = 1

sales@spasvo.com