2012-12-19 16 views
8

Tôi có Máy chủ SQL đang đạt đến giới hạn tối đa của các kết nối đồng thời. Tôi có nhiều máy chủ khác nhau & dịch vụ kết nối với một Máy chủ SQL cùng một lúc.SQL - Cách tìm những hành động nào đang sử dụng tất cả các kết nối đồng thời tối đa

tôi đã tìm thấy một truy vấn mà dường như làm việc:

SELECT DB_NAME(dbid) AS DBName, 
    COUNT(dbid) AS NumberOfConnections, 
    loginame  AS LoginName, 
    nt_domain  AS NT_Domain, 
    nt_username AS NT_UserName, 
    hostname  AS HostName 
FROM sys.sysprocesses 
WHERE dbid > 0 
GROUP BY dbid, 
     hostname, 
     loginame, 
     nt_domain, 
     nt_username 
ORDER BY NumberOfConnections DESC; 

Tuy nhiên, điều này mang lại cho tôi số lượng kết nối đó là tốt. Vì vậy, sau đó tôi tìm thấy một truy vấn mà dường như nhổ ra các báo cáo sql rằng er đang chạy vv

SELECT 
SPID    = er.session_id 
,STATUS    = ses.STATUS 
,[Login]   = ses.login_name 
,Host    = ses.host_name 
,BlkBy    = er.blocking_session_id 
,DBName    = DB_Name(er.database_id) 
,CommandType  = er.command 
,SQLStatement  = st.text 
,ObjectName   = OBJECT_NAME(st.objectid) 
,ElapsedMS   = er.total_elapsed_time 
,CPUTime   = er.cpu_time 
,IOReads   = er.logical_reads + er.reads 
,IOWrites   = er.writes 
,LastWaitType  = er.last_wait_type 
,StartTime   = er.start_time 
,Protocol   = con.net_transport 
,ConnectionWrites = con.num_writes 
,ConnectionReads = con.num_reads 
,ClientAddress  = con.client_net_address 
,Authentication  = con.auth_scheme 
FROM sys.dm_exec_requests er 
OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st 
LEFT JOIN sys.dm_exec_sessions ses 
ON ses.session_id = er.session_id 
LEFT JOIN sys.dm_exec_connections con 
ON con.session_id = ses.session_id 

làm cách nào để hợp nhất cả hai truy vấn này lại với nhau? Tôi tin rằng cả hai truy vấn này cùng nhau sẽ cho tôi những gì tôi cần.

+9

[sp_whoisactive] (http: // sqlblog .com/blogs/adam_machanic/archive/2012/03/22/release-who-is-active-v11-11.aspx) có thể rất hữu ích cho bạn –

Trả lời

1

Không hoàn toàn chắc chắn những gì bạn muốn trên đầu ra; bạn có thể tham gia hai truy vấn với nhau (không có nhóm) thông qua một tham gia stright session_id = spid.

SELECT 
spr.loginame as LoginName, 
spr.nt_domain  AS NT_Domain, 
spr.nt_username AS NT_UserName, 
spr.hostname  AS HostName, 

STATUS    = ses.STATUS 
,[Login]   = ses.login_name 
,Host    = ses.host_name 
,BlkBy    = er.blocking_session_id 
,DBName    = DB_Name(er.database_id) 
,CommandType  = er.command 
,SQLStatement  = st.text 
,ObjectName   = OBJECT_NAME(st.objectid) 
,ElapsedMS   = er.total_elapsed_time 
,CPUTime   = er.cpu_time 
,IOReads   = er.logical_reads + er.reads 
,IOWrites   = er.writes 
,LastWaitType  = er.last_wait_type 
,StartTime   = er.start_time 
,Protocol   = con.net_transport 
,ConnectionWrites = con.num_writes 
,ConnectionReads = con.num_reads 
,ClientAddress  = con.client_net_address 
,Authentication  = con.auth_scheme 
FROM [sys.dm_exec_requests][1] er 
OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st 
LEFT JOIN sys.dm_exec_sessions ses 
ON ses.session_id = er.session_id 
LEFT JOIN sys.dm_exec_connections con 
ON con.session_id = ses.session_id 
left outer join sys.sysprocesses spr 
on er.session_id = spr.spid 
+0

Điều đó có vẻ tốt. nhưng vấn đề là nó chỉ hiển thị cơ sở dữ liệu chủ và không phải tất cả các cơ sở dữ liệu. – user1158745

+0

Người dùng của bạn có quyền VIEW SERVER STATE không? – u07ch

1

Tôi không thực sự chắc chắn bạn sẽ cần biết thêm gì ngoài sys.dm_exec_connections nếu số lượng kết nối là những gì bạn quan tâm. Dù bằng cách nào, đây là mã tôi sử dụng khi xem những gì đang chạy trên cá thể, nó cũng cho bạn thấy công việc nào đang chạy câu lệnh (nếu đó là công việc):

SELECT 
    SPID    = er.session_id 
    , Status    = ses.status 
    , [Login]   = ses.login_name 
    , Host    = ses.host_name 
    , BlkBy    = er.blocking_session_id 
    , DBName    = DB_Name(er.database_id) 
    , CommandType  = er.command 
    , SQLStatement  = 
    SUBSTRING 
    (
     qt.text, 
     er.statement_start_offset/2, 
     (CASE WHEN er.statement_end_offset = -1 
     THEN LEN(CONVERT(nvarchar(MAX), qt.text)) * 2 
     ELSE er.statement_end_offset 
     END - er.statement_start_offset)/2 
    ) 
    , sj.name + SUBSTRING(ses.program_name,65,8) JobName 
    , ObjectName   = OBJECT_SCHEMA_NAME(qt.objectid,dbid) + '.' + OBJECT_NAME(qt.objectid, qt.dbid) 
    , ElapsedMS   = er.total_elapsed_time 
    , CPUTime   = er.cpu_time 
    , IOReads   = er.logical_reads + er.reads 
    , IOWrites   = er.writes 
    , LastWaitType  = er.last_wait_type 
    , StartTime   = er.start_time 
    , Protocol   = con.net_transport 
    , transaction_isolation = 
    CASE ses.transaction_isolation_level 
     WHEN 0 THEN 'Unspecified' 
     WHEN 1 THEN 'Read Uncommitted' 
     WHEN 2 THEN 'Read Committed' 
     WHEN 3 THEN 'Repeatable' 
     WHEN 4 THEN 'Serializable' 
     WHEN 5 THEN 'Snapshot' 
    END 
    , ConnectionWrites = con.num_writes 
    , ConnectionReads = con.num_reads 
    , ClientAddress  = con.client_net_address 
    , Authentication  = con.auth_scheme 
FROM sys.dm_exec_requests er 
    LEFT OUTER JOIN sys.dm_exec_sessions ses 
     ON ses.session_id = er.session_id 
    LEFT OUTER JOIN sys.dm_exec_connections con 
     ON con.session_id = ses.session_id 
    LEFT OUTER JOIN msdb..sysjobs sj 
     ON upper(convert(varchar(34), master.dbo.fn_varbintohexstr(convert(varbinary(16), sj.job_id)))) = LTRIM(RTRIM(SUBSTRING(ses.program_name,29,36))) 
    OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) as qt 
WHERE er.session_id > 50 
ORDER BY 
    er.blocking_session_id DESC 
    ,er.session_id