--sp_who 能夠指定數據庫名,查詢指定數據庫的鏈接狀況 sp_who go select DB_NAME(database_id) dbname, login_name, t1.session_id, t1.request_id, t2.status, t1.start_time, host_name from sys.dm_exec_requests t1 inner join sys.dm_exec_sessions t2 on t1.session_id = t2.session_id go --包含正在 Microsoft SQL Server 實例上運行的進程的相關信息。這些進程能夠是客戶端進程或系統進程。若要訪問 sysprocesses,您必須位於 master 數據庫上下文中,或者必須使用由三部分構成的名稱 master.dbo.sysprocesses。 select * from sys.sysprocesses --查詢指定數據庫的鏈接狀況 select * from [Master].[dbo].[SYSPROCESSES] where [DBID] in ( select [DBID] from [Master].[dbo].[SYSDATABASES] where name='bpm' ) go ---數據庫系統全部請求狀況 select s.session_id, s.status, db_name(r.database_id) as database_name, s.login_name, s.login_time, s.host_name, c.client_net_address, c.client_tcp_port, s.program_name, r.cpu_time, r.reads, r.writes, c.num_reads, c.num_writes, s.client_interface_name, s.last_request_start_time, s.last_request_end_time, c.connect_time, c.net_transport, c.net_packet_size, r.start_time, r.status, r.command, r.blocking_session_id, r.wait_type, r.wait_time, r.last_wait_type, r.wait_resource, r.open_transaction_count, r.percent_complete, r.granted_query_memory from Sys.dm_exec_requests r with ( nolock ) right outer join Sys.dm_exec_sessions s with ( nolock ) on r.session_id = s.session_id right outer join Sys.dm_exec_connections c with ( nolock ) on s.session_id = c.session_id --where s.session_id > 50 order by s.login_time go ---哪一個用戶鏈接數最多: select login_name, COUNT(0) user_count from Sys.dm_exec_requests r with ( nolock ) right outer join Sys.dm_exec_sessions s with ( nolock ) on r.session_id = s.session_id right outer join Sys.dm_exec_connections c with ( nolock ) on s.session_id = c.session_id where s.session_id > 50 group by login_name order by 2 desc go ---哪臺機器發起到數據庫的鏈接數最多: select s.host_name, c.client_net_address, COUNT(0) host_count from Sys.dm_exec_requests r with ( nolock ) right outer join Sys.dm_exec_sessions s with ( nolock ) on r.session_id = s.session_id right outer join Sys.dm_exec_connections c with ( nolock ) on s.session_id = c.session_id where s.session_id > 50 group by host_name, client_net_address go --進程狀態 select s.status, COUNT(0) host_count from Sys.dm_exec_requests r with ( nolock ) right outer join Sys.dm_exec_sessions s with ( nolock ) on r.session_id = s.session_id right outer join Sys.dm_exec_connections c with ( nolock ) on s.session_id = c.session_id where s.session_id > 50 group by s.status order by 2 desc go --查看數據庫阻塞狀況 select t1.resource_type as [lock type], db_name(resource_database_id) as [database], t1.resource_associated_entity_id as [blk object], t1.request_mode as [lock req] -- lock requested , t1.request_session_id as [waiter sid] -- spid of waiter , t2.wait_duration_ms as [wait time], ( select text from sys.dm_exec_requests as r with ( nolock ) --- get sql for waiter cross apply sys.dm_exec_sql_text(r.sql_handle) where r.session_id = t1.request_session_id ) as waiter_batch, ( select substring(qt.text, r.statement_start_offset / 2, ( case when r.statement_end_offset = -1 then len(convert(nvarchar(max), qt.text)) * 2 else r.statement_end_offset end - r.statement_start_offset ) / 2 + 1) from sys.dm_exec_requests as r with ( nolock ) cross apply sys.dm_exec_sql_text(r.sql_handle) as qt where r.session_id = t1.request_session_id ) as waiter_stmt --- statement executing now , t2.blocking_session_id as [blocker sid] --- spid of blocker , ( select text from sys.sysprocesses as p with ( nolock ) --- get sql for blocker cross apply sys.dm_exec_sql_text(p.sql_handle) where p.spid = t2.blocking_session_id ) as blocker_stmt, getdate() time from sys.dm_tran_locks as t1 with ( nolock ) , sys.dm_os_waiting_tasks as t2 with ( nolock ) where t1.lock_owner_address = t2.resource_address go select db_name(r.database_id) as database_name, COUNT(0) host_count from Sys.dm_exec_requests r with ( nolock ) right outer join Sys.dm_exec_sessions s with ( nolock ) on r.session_id = s.session_id right outer join Sys.dm_exec_connections c with ( nolock ) on s.session_id = c.session_id where s.session_id > 50 group by r.database_id order by 2 desc go --查看阻塞其餘進程的進程(阻塞源頭) select t2.blocking_session_id,COUNT(0) counts from sys.dm_tran_locks as t1 with(nolock) , sys.dm_os_waiting_tasks as t2 with(nolock) where t1.lock_owner_address = t2.resource_address group by blocking_session_id order by 2 go --被阻塞時間最長的進程 select top 10 t1.resource_type as [lock type], db_name(resource_database_id) as [database], t1.resource_associated_entity_id as [blk object], t1.request_mode as [lock req] -- lock requested , t1.request_session_id as [waiter sid] -- spid of waiter , t2.wait_duration_ms as [wait time], ( select text from sys.dm_exec_requests as r with ( nolock ) --- get sql for waiter cross apply sys.dm_exec_sql_text(r.sql_handle) where r.session_id = t1.request_session_id ) as waiter_batch, ( select substring(qt.text, r.statement_start_offset / 2, ( case when r.statement_end_offset = -1 then len(convert(nvarchar(max), qt.text)) * 2 else r.statement_end_offset end - r.statement_start_offset ) / 2 + 1) from sys.dm_exec_requests as r with ( nolock ) cross apply sys.dm_exec_sql_text(r.sql_handle) as qt where r.session_id = t1.request_session_id ) as waiter_stmt --- statement executing now , t2.blocking_session_id as [blocker sid] --- spid of blocker , ( select text from sys.sysprocesses as p with ( nolock ) --- get sql for blocker cross apply sys.dm_exec_sql_text(p.sql_handle) where p.spid = t2.blocking_session_id ) as blocker_stmt, getdate() time from sys.dm_tran_locks as t1 with ( nolock ) , sys.dm_os_waiting_tasks as t2 with ( nolock ) where t1.lock_owner_address = t2.resource_address order by t2.wait_duration_ms desc