我想找出是什么导致性能监视器计数器中出现的高SQL编译(不是重新编译)。
这是我的看法:如果我看到许多SQl编译,则意味着由于以下原因,我们的系统上的查询未得到缓存:
- 许多特别查询
运行SQl不缓存的查询,例如:
UPDATE table1 SET col1 ='字符串长于8000个字符...'WHERE key_column =一些整数
计划正在超时并从缓存中删除,原因如下:缓存空间不足或计划使用时间不够长。
捕获捕获到探查器中的缓存插入的唯一方法是存储过程-> SP:CacheInserts,但它仅负责存储过程缓存。
所以我尝试了以下方法来获取即席查询:
SELECT [cp].[refcounts] -- when Refcounts becomes 0, plan is excluded from cache.
, [cp].[usecounts]
, [cp].[objtype]
, st.[dbid]
, st.[objectid]
, st.[text]
, [qp].[query_plan]
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text ( cp.plan_handle ) st
CROSS APPLY sys.dm_exec_query_plan ( cp.plan_handle ) qp ;
我认为导致编译的查询应该是objtype = Adhoc的查询,但这也可能与重新编译有关。现在,我必须运行事件探查器,捕获导致重新编译的查询,然后从上面的列表中删除它。
我朝着正确的方向前进吗?
我可以使用一个查询来完成SQL编译而无需进行太多工作吗?
帮助我获得上述知识的资源:
http://social.msdn.microsoft.com/Forums/zh-CN/sqldatabaseengine/thread/954b4fba-3774-42e3-86e7-e5172abe0c83
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=143946
http: //technet.microsoft.com/zh-CN/library/cc966425(zh-cn).aspx
http://www.sqlservercentral.com/Forums/Topic914951-360-1.aspx
任何帮助都非常感谢。