Sql-Server
如何從 SQL Server 查詢記憶體中刪除特定的錯誤計劃?
我們有一個特定的 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;