Comment déterminer le nombre total de connexions ouvertes / actives dans MS SQL Server 2005

90

Mon application PHP / MS Sql Server 2005 / win 2003 devient parfois très insensible, l'utilisation de la mémoire / cpu n'augmente pas. Si j'essaie d'ouvrir une nouvelle connexion à partir du studio de gestion SQL, cela se bloque simplement dans la boîte de dialogue de connexion ouverte. comment déterminer le nombre total de connexions actives ms sql server 2005

Andy Lester
la source

Réponses:

268

Cela montre le nombre de connexions pour chaque DB:

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

Et cela donne le total:

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

Si vous avez besoin de plus de détails, exécutez:

sp_who2 'Active'

Remarque: le compte SQL Server utilisé a besoin du rôle 'sysadmin' (sinon, il affichera juste une seule ligne et un nombre de 1 comme résultat)

Blé Mitch
la source
1
Merveilleux merci beaucoup. Pour les novices comme moi, démarrez SQL Server Management Studio, faites un clic droit sur votre base de données, sélectionnez Nouvelle requête, collez-la et cliquez sur le bouton "! Aller".
8
Cela ne devrait être ni accepté, ni réponse aux votes les plus élevés, car elle est tout simplement incorrecte. Vous ne pouvez vous fier au numéro renvoyé que si vous êtes connecté en tant que sa. Si vous êtes connecté en tant qu'utilisateur non-sa, vous verrez 1 et cela ne sera pas représentatif des connexions réelles.
ajeh
3
@ajeh: Il est implicite que vous disposez des autorisations suffisantes pour exécuter la tâche. Votre commentaire est redondant.
Mitch Wheat
2
@ IEBasara: C'est implicite. Pourquoi vous attendez-vous à ce qu'un non-administrateur puisse voir ces informations?
Mitch Wheat
1
En retard à la fête .. mais .. le sysadminrôle requis (modifier le commentaire) a sauvé mon buttox. J'ai continué à en avoir 1 en supposant que j'avais les bonnes permanentes. Phew! fixe et corrigé. victoire : money_with_wings:
Pure.Krome
7

Comme @jwalkerjr l'a mentionné, vous devez supprimer les connexions dans le code (si le regroupement de connexions est activé, elles sont simplement renvoyées au pool de connexions). La manière prescrite pour ce faire est d'utiliser l' usinginstruction ' ':

// 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);
            }
        }
    }
}
Blé Mitch
la source
Le demandeur a mentionné qu'il utilisait PHP, donc l'exemple de code peut ne pas lui convenir. Le garbage collector devrait automatiquement nettoyer les connexions SQL Server non persistantes lorsqu'il n'y a plus de références à celles-ci (et toutes les références seraient supprimées à la fin du cycle de page), mais peut-être que le demandeur utilise des connexions persistantes, ce qui nécessite une connexion intelligente réutilisation.
Paul d'Aoust
5

Utilisez ceci pour obtenir un décompte précis pour chaque pool de connexions (en supposant que chaque processus utilisateur / hôte utilise la même chaîne de connexion)

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
la source
4

Je sais que c'est vieux, mais j'ai pensé que ce serait une bonne idée de le mettre à jour. Si un décompte précis est nécessaire, l'ECID de la colonne doit également être filtré. Un SPID avec des threads parallèles peut apparaître plusieurs fois dans les processus système et le filtrage ECID = 0 renverra le thread principal pour chaque 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
la source
0

voir sp_who il vous donne plus de détails que de simplement voir le nombre de connexions

dans votre cas, je ferais quelque chose comme ça

 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
la source
0

Basé sur les connaissances MS SQL - Comment connaître les connexions de base de données SQL ouvertes et occupées sur quel hôte.

En utilisant la requête ci-dessous, vous trouverez la base de données de la liste, le nom d'hôte et le nombre total de connexions ouvertes, en fonction de cela, vous aurez une idée de l'hôte qui a occupé la connexion 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
la source
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
la source