2013年8月7日 星期三

如何取得 SQL Server 資料庫正在執行的 T-SQL 指令與詳細資訊

使用 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

沒有留言:

張貼留言