2012-01-05 20 views
17

ウェブアプリケーションに接続リークがあると思われています(タイムアウトと最大接続エラーが発生しました)。そこで、プール内でアクティブなデータベース接続の数を監視したかったのです。私はSQL Expressを使用しているので、いくつかのヘルプガイドに示唆されているようにUser Connectionsパフォーマンスカウンタがありません。SQL Serverでアクティブな接続プールを監視する方法は?

私はWindows 2008のパフォーマンスモニタを使用することもできますが、その方法はわかりません。それに関するすべてのガイドは高く評価されます。

答えて

23

使用シンプル

SELECT * FROM sys.dm_exec_connections 

OR

試してみて、あなたには、いくつかの他のデータ

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

をSELECT実行している場合*あなたが探しているものsys.dm_exec_connectionsから? –

4

が必要な場合は、組み込みのストアドプロシージャ

を実行できる場合には、このスクリプトを採用
exec sp_who 
exec sp_who2 
+0

これはオレグの回答を支持して廃止されました – Liam

5

これは、ユーザーごとに、データベースごとの接続数を与える:

SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections, 
    loginame as LoginName 
FROM 
    sys.sysprocesses 
WHERE 
    dbid > 0 
GROUP BY 
    dbid, loginame 
; 
関連する問題