我们有一个特定的sql Server 2008查询(不是存储过程,但是相同的sql字符串 – 每5分钟执行一次)间歇性地缓存一个非常糟糕的查询计划.
解决方法
我想出了一些事情
select * from sys.dm_exec_query_stats
将显示所有缓存的查询计划.不幸的是,那里没有显示sql文本.
但是,您可以将sql文本加入计划,如下所示:
select plan_handle,creation_time,last_execution_time,execution_count,qt.text FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text (qs.[sql_handle]) AS qt
从这里开始,添加一个WHERE子句来查找查询中我知道的sql是非常简单的,然后我可以执行:
DBCC FREEPROCCACHE (plan_handle_id_goes_here)
从查询计划缓存中删除每个查询计划.不是很简单或方便,但它似乎工作..
编辑:转储整个查询缓存也会起作用,并且比听起来更危险,至少根据我的经验:
DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL;