8

同時接続の最大制限に達している SQL Server があります。1 つの SQL Server に同時に多数の異なるサーバーとサービスを接続しています。

うまくいくと思われる別のクエリを見つけました:

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ステートメントなどを吐き出すように見える別のクエリを見つけました。

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

これらのクエリの両方をマージするにはどうすればよいですか? これらのクエリの両方を一緒にすると、必要なものが得られると思います。

4

2 に答える 2

1

出力に何が必要か完全にはわかりません。stright join session_id = spid を使用して、2 つのクエリを (グループなしで) 結合できます。

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
于 2012-12-19T16:56:16.820 に答える
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
于 2013-03-08T11:19:06.137 に答える