如何从SQL Server查询缓存中删除特定的错误计划?

Modified on: Wed, 06 Nov 2019 08:00:04 +0800

我们有一个特定的SQL Server 2008查询(不是存储过程,但是相同的SQL字符串 - 每5分钟执行一次)间歇性地缓存一个非常糟糕的查询计划。

此查询通常在几毫秒内运行,但如果使用此错误的查询计划,则需要30秒以上。

如何从SQL Server 2008中手动仅删除一个错误的缓存查询计划,而不会吹掉生产数据库服务器上的整个查询缓存?

最佳答案

我想出了一些事情

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)

从查询计划缓存中删除每个查询计划。不是很简单或方便,但出现才能工作..

编辑:转储整个查询缓存也会起作用,并且不如听起来那么危险,至少根据我的经验:

带有MARK_IN_USE_FOR_REMOVAL的

DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL;
作者:,Jeff Atwood

相关问答

添加新评论