Sql-Server

如何從 SQL Server 查詢記憶體中刪除特定的錯誤計劃?

  • May 29, 2014

我們有一個特定的 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)

從查詢計劃記憶體中刪除每個查詢計劃。不是很容易或方便,但它似乎工作..

編輯:轉儲整個查詢記憶體也可以工作,並且比聽起來更危險,至少在我的經驗中:

DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL;

引用自:https://serverfault.com/questions/91285