Mihai 将您指向当前的系统对象,dm_exec_cached_plans
. (当我查找您问题的答案时,我发现它[syscacheobjects]
实际上已被弃用。)因此,我确实赞成他的回答。
但是,我仍然认为它可以节省您的时间,在WHERE
. 使用dm_exec_cached_plans
,这是一个类似的查询,使用WHERE
我之前给你的类似查询:
SELECT usecounts, cacheobjtype, objtype, text
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
WHERE [text] LIKE '%WHERE%''%'
----AND [text] NOT LIKE '%sp_executesql%' ----queries probably ok, with sp_executesql
----WHERE usecounts > 1 ----un-commenting this might also be interesting to check out.
ORDER BY usecounts DESC;
或者,只需将其添加到 Mihai 的查询中:
SELECT
CP.usecounts
, CP.cacheobjtype
, ST.text as sql_Statement
, 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
WHERE
CP.objtype = 'Adhoc'
AND ST.dbid = DB_ID()
AND ST.text LIKE '%WHERE%''%'
ORDER BY
CP.usecounts DESC
请注意ORDER BY
,基于常见查询导致频繁暴露的想法。但是您可能已经意识到……如果可疑代码自己构建查询字符串,那么唯一值(如行号或客户 ID 或订单号等)可能会产生唯一的查询,(如果它们是在不使用的情况下构建的)sp_executesql
),实际上可能是最重要的,即使它们有usecounts = 1
.
至于您的问题的答案,(“SQL 查询何时从该表中删除?”):一旦缓存中有足够的查询导致“内存压力”,旧查询作为新查询从缓存中删除进来......当SQL重新启动时,所有这些都被清除了。(见http://www.sqlservercentral.com/Forums/Topic1375781-391-1.aspx和http://technet.microsoft.com/en-us/library/ms181055%28v=sql.105%29.aspx)
希望有帮助...