Como determinar o número total de conexões abertas / ativas no ms sql server 2005

90

Meu aplicativo PHP / MS Sql Server 2005 / win 2003 às vezes deixa de responder, o uso de memória / cpu não aumenta. Se eu tentar abrir qualquer nova conexão do sql management studio, ele apenas trava na caixa de diálogo de conexão aberta. como determinar o número total de conexões ativas ms sql server 2005

Andy Lester
fonte

Respostas:

268

Mostra o número de conexões por cada DB:

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

E isso dá o total:

SELECT 
    COUNT(dbid) as TotalConnections
FROM
    sys.sysprocesses
WHERE 
    dbid > 0

Se precisar de mais detalhes, execute:

sp_who2 'Active'

Observação: a conta do SQL Server usada precisa da função 'sysadmin' (caso contrário, mostrará apenas uma única linha e uma contagem de 1 como resultado)

Trigo mitch
fonte
1
Maravilhoso, muito obrigado. Para iniciantes como eu, inicie o SQL Server Management Studio, clique com o botão direito no seu banco de dados, selecione Nova consulta, cole e clique no botão "! Ir".
8
Esta não deve ser aceita, nem a resposta com maior votação, pois é simplesmente incorreta. Você só pode confiar no número retornado se estiver conectado como sa. Se você estiver conectado como um usuário não sa, verá 1 e isso não representará as conexões reais.
ajeh
3
@ajeh: Está implícito que você tem permissões suficientes para realizar a tarefa. Seu comentário é redundante.
Mitch Wheat
2
@ IEBasara: Está implícito. Por que você esperaria que um não administrador pudesse ver essas informações?
Mitch Wheat,
1
Atrasado para a festa .. mas .. o sysadminpapel exigido (editar comentário) salvou meu buttox. Continuei recebendo 1, supondo que tinha os permanentes certos. Ufa! fixo e controlado. win : money_with_wings:
Pure.Krome
7

Como @jwalkerjr mencionou, você deve descartar as conexões no código (se o pool de conexão estiver habilitado, elas serão apenas retornadas ao pool de conexão). A maneira prescrita de fazer isso é usando a usinginstrução ' ':

// Execute stored proc to read data from repository
using (SqlConnection conn = new SqlConnection(this.connectionString))
{
    using (SqlCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = "LoadFromRepository";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@ID", fileID);

        conn.Open();
        using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
        {
            if (rdr.Read())
            {
                filename = SaveToFileSystem(rdr, folderfilepath);
            }
        }
    }
}
Trigo mitch
fonte
O autor da pergunta mencionou que eles estavam usando PHP, portanto, o exemplo de código pode não ser apropriado para eles. O coletor de lixo deve limpar automaticamente as conexões não persistentes do SQL Server quando não houver mais referências a elas (e todas as referências seriam descartadas no final do ciclo da página), mas talvez o solicitante esteja usando conexões persistentes, o que requer uma conexão inteligente reuso.
Paul d'Aoust de
5

Use isso para obter uma contagem precisa para cada pool de conexão (assumindo que cada usuário / processo de host usa a mesma string de conexão)

SELECT 
DB_NAME(dbid) as DBName, 
COUNT(dbid) as NumberOfConnections,
loginame as LoginName, hostname, hostprocess
FROM
sys.sysprocesses with (nolock)
WHERE 
dbid > 0
GROUP BY 
dbid, loginame, hostname, hostprocess
realstrategos
fonte
4

Eu sei que isso é antigo, mas achei uma boa ideia atualizar. Se uma contagem precisa for necessária, o ECID da coluna provavelmente também deve ser filtrado. Um SPID com threads paralelos pode aparecer várias vezes em sysprocesses e a filtragem de ECID = 0 retornará o thread principal para cada SPID.

SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections,
    loginame as LoginName
FROM
    sys.sysprocesses with (nolock)
WHERE 
    dbid > 0
    and ecid=0
GROUP BY 
    dbid, loginame
sqldba.today
fonte
0

veja sp_who, ele fornece mais detalhes do que apenas ver o número de conexões

no seu caso eu faria algo assim

 DECLARE @temp TABLE(spid int , ecid int, status varchar(50),
                     loginname varchar(50),   
                     hostname varchar(50),
blk varchar(50), dbname varchar(50), cmd varchar(50), request_id int) 
INSERT INTO @temp  

EXEC sp_who

SELECT COUNT(*) FROM @temp WHERE dbname = 'DB NAME'
Mina Gabriel
fonte
0

MS SQL Knowledge Based - Como saber conexão (ões) aberta (s) de banco de dados SQL e ocupada em qual host.

Usando a consulta abaixo, você encontrará a lista de banco de dados, nome do Host e número total de contagem de conexões abertas, com base nisso você terá ideia de qual host ocupou a conexão SQL.

SELECT DB_NAME(dbid) as DBName, hostname ,COUNT(dbid) as NumberOfConnections
FROM sys.sysprocesses with (nolock) 
WHERE dbid > 0 
and len(hostname) > 0 
--and DB_NAME(dbid)='master' /* Open this line to filter Database by Name */
Group by DB_NAME(dbid),hostname
order by DBName
Tarun Harkinia
fonte
0
SELECT
[DATABASE] = DB_NAME(DBID), 
OPNEDCONNECTIONS =COUNT(DBID),
[USER] =LOGINAME
FROM SYS.SYSPROCESSES
GROUP BY DBID, LOGINAME
ORDER BY DB_NAME(DBID), LOGINAME
FatemehEbrahimiNik
fonte