日期:2014-05-17 浏览次数:20599 次
--开启optimize for ad hoc workloads后,
EXEC sp_configure 'optimize for ad hoc workloads', 1;
RECONFIGURE;
GO
select * from tableTest where id=1
SELECT usecounts, cacheobjtype, objtype, [text]
FROM sys.dm_exec_cached_plans P
CROSS APPLY sys.dm_exec_sql_text (plan_handle)
WHERE cacheobjtype LIKE 'Compiled Plan%'
AND [text] NOT LIKE '%dm_exec_cached_plans%';
--计划缓存其实我更习惯在select * from sys.syscacheobjects where dbid=DB_ID()里面看
--不知道这两种方式有啥区别,内部还是一个表吧?
----------结果
usecounts cacheobjtype objtype text
1 Compiled Plan Stub Adhoc select * from tableTest where id=1
--关键就是这里的Compiled Plan Stub,
--没有开启optimize for ad hoc workloads,缓存类型是Compiled Plan
--上面参考的文章中说:第一次任何一个adhoc查询被编译时缓存一个存根,
--在第二次编译后,存根用以取代全部计划。
--也就是说,存储Compiled Plan Stub类型的缓存,占用的内存比较少,
--第二次执行后完全相同sql后,才存储完整的编译
--这是我的理解,
--我的问题就在于:Compiled Plan Stub是个什么东西?
--执行计划是怎么缓存的?缓存中查询到的信息是不是真正的执行计划?
--开启了optimize for ad hoc workloads后,
--比如执行select * from table where id =1这个ad hoc 的sql
--这个sql的执行时依赖于执行计划,
--但是计划缓存中的Compiled Plan Stub貌似是个“半成品”的执行计划,
--此类型的缓存占用内存少什么的(参考“淺談執行計畫快取和重用”)
--难道说执行select * from table where id =1没有生成执行计划,
--或者说缓存中的信息(就是上面两种查询缓存的方式查询出来的信息)压根就不是执行计划
--csdn这种无法即见及所得的编辑方式真是蛋疼啊