使用 sp_who 或 sp_who2 這些系統預儲程序,雖然可以查出所有連線的狀況,也可以看到該連線被卡住 (Blocked) 的狀況,不過 Command 這個欄位卻只有查詢的摘要,看不出完整的查詢命令為何。

這時可以利用幾個 DMVs (Dynamic Management Views) 來查詢 SQL Server 資料庫中即時的運作資訊,包括正在執行的完整 T-SQL 命令句:
SELECT
r.scheduler_id as 排程器識別碼,
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, /* 完整的 T-SQL 指令碼 */
d.name as [資料庫名稱],
c.client_net_address as [用戶端IP地址],
c.client_tcp_port as [用戶端Port]
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)
LEFT JOIN sys.dm_exec_connections c ON ( r.connection_id = c.connection_id )
ORDER BY
r.total_elapsed_time desc

沒有留言:
張貼留言