2012-12-19 17 views
8

Eşzamanlı bağlantıların maksimum sınırına ulaşan bir SQL Server var. Bir SQL Server'a aynı anda bağlanan çok sayıda farklı sunucu & hizmetlerim var.SQL - Eşzamanlı tüm bağlantıların tümünü kullanan eylemler nasıl bulunur

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; 

Ancak bu bana iyi bağlantı sayısını verir:

işe görünüyor başka bir sorgu buldunuz. Öyleyse ben
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 

nasıl ben birlikte bu sorgunun hem birleştirmeyi öngören vb er yürütülüyor olduğunu sql ifadeleri tükürmek gibi görünüyor başka bir sorgu bulundu? Bu sorguların her ikisinin de birlikte ihtiyacım olan şeyi vereceğine inanıyorum.

+9

[sp_whoisactive] (http: // sqlblog .com/bloglar/adam_machanic/arşiv/2012/03/22/yayınlanan-who-is-active-v11-11.aspx) sizin için çok yararlı olabilir –

cevap

1

Çıktıdan ne istediğinizi tam olarak emin değilsiniz; iki sorguya birlikte (grup olmadan) stright join session_id = spid ile katılabilirsiniz.

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

Bu iyi görünüyor. Ancak sorun, yalnızca veritabanını değil, yalnızca ana veritabanını göstermesidir. – user1158745

+0

Kullanıcınız VIEW SERVER STATE ürününe sahip mi? – u07ch

1

Daha sen bağlantı sayısı sizinle ilgili ne ise sys.dm_exec_connections ötesinde bilmek gerekir ne gerçekten emin değilim. Bu iki şekilde de örneği üzerinde çalışan ne bakarken kullandığım kod, aynı zamanda hangi işi deyimi çalıştığı gösterir (bu bir iş ise):

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 
İlgili konular