2012-01-05 25 views
17

Podejrzewam, że moja aplikacja internetowa ma przecieki połączenia (uzyskanie limitu czasu i maksymalne połączenie osiągnęło błąd). Chciałem więc monitorować, ile połączeń z bazą danych jest aktywnych w puli. Korzystam z SQL Express, więc nie mam licznika wydajności User Connections, co sugerują niektóre przewodniki pomocy.Jak monitorować aktywną pulę połączeń w SQL Server?

Odkryłem, że mogę również użyć monitora wydajności serwera Win 2008, ale nie mam pojęcia, jak to zrobić. Każdy przewodnik na ten temat byłby doceniony.

Odpowiedz

23

używać prostych

SELECT * FROM sys.dm_exec_connections 

LUB

spróbować przyjąć ten scenariusz w przypadku, jeśli potrzebujesz jakieś inne dane

declare @now datetime 
set  @now = getdate() 
set nocount off 
select p.spid      as spid 
    , rtrim(p.loginame)   as SQLUser 
    , rtrim(p.nt_username)  as NTUser 
    , rtrim(p.nt_domain)   as NTDomain 
    , rtrim(case 
     when p.blocked <> 0 then 'BLOCKED' 
     else p.status 
     end)      as status 
    , case 
     when p.blocked is null or p.blocked = 0 then ''  
     else convert(varchar(10),p.blocked) 
     end       as BlockedBySpid 
    , rtrim(p.cmd)    as CurrentCommand 
    , case when p.dbid = 0 then '' else rtrim(db_name(p.dbid)) end as DBName 
    , isnull(rtrim(p.program_name),'')  as ProgramName 
    , cast(cast(p.waittype as int) as nvarchar(10)) as CurrentWaitType 
    , p.waittime    as CurrentWaitTime 
    , p.lastwaittype    as LastWaitType 
    , rtrim(p.waitresource)  as LastWaitResource 
    , p.open_tran     as OpenTransactionCnt 
    , p.cpu      as CPUTime 
    , convert(bigint, p.physical_io) as DiskIO 
    , p.memusage     as MemoryUsage 
    , p.hostprocess    as HostProcess 
    , rtrim(p.hostname)   as HostName 
    , p.login_time    as LoginTime 
    , p.last_batch    as LastBatchTime 
    , p.net_address    as NetAddress 
    , ltrim(rtrim(p.net_library)) as NetLibrary 
    , case 
     when lower(p.status) not in ('sleeping', 'background', 'dormant', 'suspended') 
     or  p.open_tran > 0 
     or  p.blocked > 0 
     or  upper(ltrim(rtrim(p.cmd))) like 'WAITFOR%' 
     then 'Y' 
     else 'N' 
     end       as Active 
    , case 
     when p.net_address <> '' -- Non system processes 
     and  p.program_name not like 'SQLAgent - %' 
     then 'N' 
     else 'Y' 
     end       as SystemProcess 
    , case 
     when p.last_batch = '19000101'  then 'n/a' 
     when datediff(day,  p.last_batch, @now) > 2 then convert(varchar(10),datediff(day,  p.last_batch, @now)) + ' days' 
     when datediff(hour,  p.last_batch, @now) >= 4 then convert(varchar(10),datediff(hour,  p.last_batch, @now)) + ' hrs' 
     when datediff(minute, p.last_batch, @now) >= 10 then convert(varchar(10),datediff(minute, p.last_batch, @now)) + ' min' 
     else convert(varchar(10),datediff(second, p.last_batch, @now)) + ' sec' 
     end       as TimeSinceLastBatch 
    , p.kpid      as InternalKPID 
    , case  
     when (lower(p.status) in ('background', 'dormant') 
     and  p.open_tran <= 0 
     and  p.blocked <= 0 
     and  upper(ltrim(rtrim(p.cmd))) not like 'WAITFOR%' 
     ) or (
     lower(p.status) like '%sleeping%' 
     ) 
     then 0 
     else p.kpid 
     end       as kpid 
    , (convert(nvarchar,p.spid) + '.' + case  
             when (lower(p.status) in ('background', 'dormant') 
             and  p.open_tran <= 0 
             and  p.blocked <= 0 
             and  upper(ltrim(rtrim(p.cmd))) not like 'WAITFOR%' 
             ) or (
             lower(p.status) like '%sleeping%' 
             ) 
             then '0' 
             else convert(nvarchar,p.kpid) 
             end) + '.' + convert(nvarchar,convert(float, p.login_time)) as SessionLifeTimeKey     
    , convert(float, p.login_time) as 'LoginTimeFloatDiff' 
from sys.sysprocesses   p with (readpast) 
+1

Podczas uruchamiania SELECT * FROM sys.dm_exec_connections czego szukasz? –

4

można wykonać wbudowanej procedury przechowywanej

exec sp_who 
exec sp_who2 
+0

Są one teraz przestarzałe na rzecz odpowiedzi Olega – Liam

5

To daje liczbę połączeń na bazie jednego użytkownika:

SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections, 
    loginame as LoginName 
FROM 
    sys.sysprocesses 
WHERE 
    dbid > 0 
GROUP BY 
    dbid, loginame 
; 
Powiązane problemy