Sql-Server
只讀數據庫/副本上的 Proc 記憶體
我的任務是查找在我們的數據庫中呼叫了哪些儲存過程。為此,我開始查詢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 跟踪所有儲存過程可能會更好。