2012-12-19 40 views
8

我有一個達到併發連接最大限制的SQL Server。我有許多不同的服務器&服務同時連接到一個SQL Server。SQL - 如何查找使用所有最大併發連接的操作

我沒有找到另一查詢,似乎工作:

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; 

然而,這給了我,這是很好的連接數。於是我發現另一個查詢,似乎吐出SQL語句中運行ER等

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 

如何將我這些查詢的合併兩者一起?我相信這兩個查詢在一起會給我我需要的東西。

+9

[sp_whoisactive(HTTP:// sqlblog .com/blogs/adam_machanic/archive/2012/03/22/released-who-is-active-v11-11.aspx)可能對你非常有用 –

回答

1

不完全確定你想輸出什麼;您可以通過stright 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

看起來不錯。但問題是它只顯示主數據庫而不是所有的數據庫。 – user1158745

+0

您的用戶是否有查看服務器狀態? – u07ch

1

我不確定除了sys.dm_exec_connections之外,如果連接數是您所關心的,您還需要了解更多信息。無論哪種方式,這是在看什麼的情況下運行時,我使用的代碼,這也顯示了其運行作業的聲明(如果它是一個工作):

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