2012-12-19 12 views
8

Mam serwer SQL, który osiąga maksymalny limit współbieżnych połączeń. Mam wiele różnych serwerów usług & łączących się z jednym serwerem SQL w tym samym czasie.SQL - Jak znaleźć akcje używające wszystkich maksymalnych jednoczesnych połączeń

znalazłem kolejne zapytanie, które wydaje się działać:

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; 

Jednak to daje mi liczbę połączeń, co jest dobre. Więc znalazłem inną kwerendę, która wydaje się wypluć SQL, który jest prowadzony er itp

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 

jaki sposób mogę połączyć oba te zapytania razem? Wierzę, że oba te zapytania razem dadzą mi to, czego potrzebuję.

+9

[sp_whoisactive] (http: // sqlblog .com/blogs/adam_machanic/archive/2012/03/22/released-who-is-active-v11-11.aspx) może być dla Ciebie bardzo przydatna. –

Odpowiedz

1

Nie jesteś całkowicie pewien, czego oczekujesz na wyjściu; możesz połączyć te dwa zapytania razem (bez grupy) za pomocą polecenia join 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

To wygląda dobrze. ale problem polega tylko na tym, że pokazuje tylko główną bazę danych, a nie wszystkie bazy danych. – user1158745

+0

Czy Twój użytkownik ma STAN WIDMOWY SERWERA w prawo? – u07ch

1

Nie jestem pewien, co jeszcze trzeba by wiedzieć poza sys.dm_exec_connections gdy liczba połączeń jest to, czego dotyczy. Tak czy inaczej jest to kod używam, kiedy patrząc na to, co działa na przykład, ale również pokazuje, które zadanie jest uruchomiony oświadczenie (jeśli jest to praca):

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 
Powiązane problemy