Come determinare il numero totale di connessioni aperte / attive in ms sql server 2005


90

La mia applicazione PHP / MS Sql Server 2005 / win 2003 a volte non risponde molto, l'utilizzo della memoria / cpu non aumenta. Se provo ad aprire una nuova connessione da sql management studio, si blocca semplicemente nella finestra di dialogo della connessione aperta. come determinare il numero totale di connessioni attive ms sql server 2005

Risposte:


268

Questo mostra il numero di connessioni per ogni 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 questo dà il totale:

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

Se hai bisogno di maggiori dettagli, esegui:

sp_who2 'Active'

Nota: l'account SQL Server utilizzato necessita del ruolo 'sysadmin' (altrimenti mostrerà solo una singola riga e un conteggio di 1 come risultato)


1
Meraviglioso grazie mille. Per i principianti come me, avviare SQL Server Management Studio, fare clic con il pulsante destro del mouse sul database, selezionare Nuova query, incollarlo e fare clic sul pulsante "! Vai".

8
Questa non dovrebbe essere né accettata né votata con il voto più alto in quanto è semplicemente errata. Puoi fare affidamento sul numero restituito solo se hai effettuato l'accesso come sa. Se hai effettuato l'accesso come utente non sa, vedrai 1 e questo non rappresenterà le connessioni effettive.
ajeh

3
@ajeh: È implicito che tu abbia autorizzazioni sufficienti per svolgere l'attività. Il tuo commento è ridondante.
Mitch Wheat

2
@ IEBasara: è implicito. Perché ti aspetti che un non amministratore sia in grado di visualizzare tali informazioni?
Mitch Wheat

1
In ritardo alla festa .. ma .. il sysadminruolo richiesto (modifica commento) ha salvato il mio buttox. Continuavo a prenderne 1 supponendo di avere le permanenti giuste. Phew! fisso e sovrastato. win : money_with_wings:
Pure.Krome

7

Come menzionato da @jwalkerjr, dovresti eliminare le connessioni nel codice (se il pool di connessioni è abilitato, vengono semplicemente restituite al pool di connessioni). Il modo prescritto per farlo è usare l' usingistruzione " ":

// 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);
            }
        }
    }
}

Il richiedente ha detto che stava usando PHP, quindi il codice di esempio potrebbe non essere appropriato per loro. Il garbage collector dovrebbe pulire automaticamente le connessioni SQL Server non persistenti quando non ci sono più riferimenti ad esse (e tutti i riferimenti verrebbero eliminati alla fine del ciclo della pagina), ma forse il richiedente sta utilizzando connessioni persistenti, che richiedono una connessione intelligente riutilizzo.
Paul d'Aoust

5

Usalo per ottenere un conteggio accurato per ogni pool di connessioni (supponendo che ogni processo utente / host utilizzi la stessa stringa di connessione)

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

4

So che è vecchio, ma ho pensato che sarebbe stata una buona idea aggiornarlo. Se è necessario un conteggio accurato, è probabile che anche la colonna ECID dovrebbe essere filtrata. Uno SPID con thread paralleli può essere visualizzato più volte in sysprocesses e il filtro ECID = 0 restituirà il thread principale per ogni 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


0

vedere sp_who fornisce maggiori dettagli oltre alla semplice visualizzazione del numero di connessioni

nel tuo caso farei qualcosa del genere

 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'

0

Basato sulla conoscenza di MS SQL - Come conoscere le connessioni al database SQL aperte e occuparsi di quale host.

Usando la query sottostante troverai il database dell'elenco, il nome host e il numero totale di connessioni aperte, in base a quello che avrai idea, quale host ha occupato la connessione 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

0
SELECT
[DATABASE] = DB_NAME(DBID), 
OPNEDCONNECTIONS =COUNT(DBID),
[USER] =LOGINAME
FROM SYS.SYSPROCESSES
GROUP BY DBID, LOGINAME
ORDER BY DB_NAME(DBID), LOGINAME
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.