平常在執行SP時,時常會遇到程式執行得特別慢,或已經跑到Time out了都還沒執行成功,SQL Server有提供各種監控的DMV(Dynamic Management View),可查詢資料庫中即時的運作資訊,也包括正在執行的完整指令。
SELECT
r.scheduler_id AS '排程器識別碼'
,r.[status] AS '要求的狀態'
,r.session_id AS 'SPID'
,r.blocking_session_id AS 'BlkBy'
,SUBSTRING(LTRIM(q.[text]),r.statement_start_offset / 2+1,
(CASE WHEN r.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), q.[text])) * 2
ELSE r.statement_end_offset
END - r.statement_start_offset) / 2
) AS '正在執行的 T-SQL 命令'
,r.cpu_time AS 'CPU Time(ms)'
,r.start_time AS '開始時間'
,r.total_elapsed_time AS '執行總時間'
,r.reads AS '讀取數'
,r.writes AS '寫入數'
,r.logical_reads AS '邏輯讀取數'
,q.[text] AS '完整的 T-SQL 指令碼'
,d.[name] AS '資料庫名稱'
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS q
LEFT JOIN sys.databases d
ON (r.database_id=d.database_id)
WHERE r.session_id > 50
AND r.session_id <> @@SPID
ORDER BY r.total_elapsed_time DESC
也可以使用sp_who2 這個系統預存程序,查看目前資料庫上的連線 Session、登入名稱、連線資料庫、裝置名稱,看是否有連線被咬住的狀況,不過Command欄位裡面只有一小句,看不到完整的部分。
在對DMV還不熟的情況下(沒背起來也無法複製時),還是習慣用sp_who2看,也比較快不用還要打一段語法,也可以直接KILL掉,只是就是看不到現在正在跑落落長程式中的哪一段(´・ω・`)