2012-12-19 11 views
8

Ho un server SQL che sta raggiungendo il limite massimo di connessioni simultanee. Ho molti server diversi servizi & che si connettono a un server SQL allo stesso tempo.SQL - Come trovare le azioni che utilizzano tutte le connessioni simultanee massime

ho trovato un'altra query che sembra funzionare:

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; 

Tuttavia, questo mi dà il numero di connessioni che è buono. Allora ho trovato un'altra query che sembra sputare le istruzioni SQL che er gestito ecc

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 

come faccio a unire entrambe queste interrogazione insieme? Credo che entrambe queste domande insieme mi daranno ciò di cui ho bisogno.

+9

[sp_whoisactive] (http: // sqlblog .com/blogs/adam_machanic/archive/2012/03/22/released-who-is-active-v11-11.aspx) potrebbe essere molto utile per voi –

risposta

1

Non completamente sicuro di ciò che si desidera sull'output; puoi unire le due query insieme (senza il gruppo) tramite un join 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

Sembra buono. ma il problema è che mostra solo il database principale e non tutti i database. – user1158745

+0

Il tuo utente ha VIEW SERVER STATE giusto? – u07ch

1

Io non sono davvero sicuro di quello che più si avrebbe bisogno di sapere al di là sys.dm_exec_connections se il numero di connessioni è che cosa siete interessati con. In entrambi i casi questo è il codice che uso quando guardando ciò che è in esecuzione sul caso, mostra anche quale lavoro è in esecuzione l'istruzione (se si tratta di un lavoro):

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 
Problemi correlati