Sql-Server

只讀數據庫/副本上的 Proc 記憶體

  • July 30, 2020

我的任務是查找在我們的數據庫中呼叫了哪些儲存過程。為此,我開始查詢sys.dm_exec_cached_plans。一切都很好,直到我轉到我們的實例,該實例具有我們的數據庫的只讀副本和我們的 AG 中的只讀輔助副本。在我看來,執行 procs 時 DMV沒有得到更新。我想是有道理的,但它還有另一種方式嗎?如果必須的話,我可以去擴展活動路線,但是 DMV 容易得多。

您正在接近,您正在查看說明已執行內容的記憶體計劃。這並不能告訴你現在、昨天或十分鐘內正在執行什麼。

試試這個看看現在正在執行什麼。

SELECT  s.loginame, db_name(s.dbid) name, s.hostname,  
s.program_name,  
s.sql_handle, s.stmt_start, s.stmt_end,  
s.spid, CONVERT(smallint, s.waittype) waittype,  
s.lastwaittype, s.ecid, s.waittime , s.blocked,  
r.plan_handle,  r.statement_start_offset, r.statement_end_offset, r.query_plan_hash, r.start_time, 
q.plan_generation_num 
FROM master..sysprocesses AS s WITH(NOLOCK)  
LEFT OUTER JOIN sys.dm_exec_requests AS r WITH(NOLOCK)  
  ON (s.spid = r.session_id) 
LEFT OUTER JOIN sys.dm_exec_query_stats q  
 ON q.plan_handle = r.plan_handle  
 AND q.statement_start_offset = r.statement_start_offset  
 AND q.statement_end_offset = r.statement_end_offset 
WHERE (s.cmd<>'AWAITING COMMAND'  
               AND s.cmd NOT LIKE '%BACKUP%'  
               AND s.cmd NOT LIKE '%RESTORE%'  
               AND s.cmd NOT LIKE 'FG MONITOR%' 
               AND s.hostprocess > '' 
               AND s.spid>50  
               AND s.spid<>@@SPID)   
AND lastwaittype NOT IN ('WAITFOR', 'SLEEP_TASK')  
ORDER BY s.spid, s.ecid ASC 

我會使用SP_Whoisactive並登錄到一個表以監視和查看正在執行的內容。請注意,這不是最好的方法。這僅擷取查詢執行時實時執行的內容。

下一個最佳方法是在數據庫上應用 CDC/CDT/觸發器通知/執行 SQL Profiler。

在我看來,執行 procs 時 DMV 沒有得到更新。

那不是真的。如果 procs 在輔助副本上執行,它將被記憶體。這可能意味著儲存的過程沒有執行,或者它被驅逐出記憶體並且不再在記憶體中。

當然,查詢記憶體並不能為您提供完整的圖片,使用分析器或 xevents 跟踪所有儲存過程可能會更好。

引用自:https://dba.stackexchange.com/questions/157415