Cómo determinar el número total de conexiones abiertas / activas en ms sql server 2005

90

Mi aplicación PHP / MS Sql Server 2005 / win 2003 ocasionalmente deja de responder, el uso de memoria / cpu no aumenta. Si trato de abrir una nueva conexión desde sql management studio, simplemente se cuelga en el cuadro de diálogo de conexión abierta. cómo determinar el número total de conexiones activas ms sql server 2005

Andy Lester
fuente

Respuestas:

268

Esto muestra el número de conexiones 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

Y esto da el total:

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

Si necesita más detalles, ejecute:

sp_who2 'Active'

Nota: La cuenta de SQL Server utilizada necesita la función 'sysadmin' (de lo contrario, solo mostrará una sola fila y un recuento de 1 como resultado)

Trigo Mitch
fuente
1
Maravilloso muchas gracias. Para los principiantes como yo, inicie SQL Server Management Studio, haga clic derecho en su base de datos, seleccione Nueva consulta, péguela y haga clic en el botón "! Ir".
8
Esto no debe ser aceptado ni la respuesta más votada, ya que es simplemente incorrecta. Solo puede confiar en el número devuelto si ha iniciado sesión como sa. Si ha iniciado sesión como usuario que no es sa, verá 1 y eso no será representativo de las conexiones reales.
ajeh
3
@ajeh: Está implícito que tienes permisos suficientes para realizar la tarea. Tu comentario es redundante.
Mitch Wheat
2
@ IEBasara: Está implícito. ¿Por qué esperaría que una persona que no sea un administrador pueda ver dicha información?
Mitch Wheat
1
Tarde para la fiesta .. pero .. el sysadminrol requerido (editar comentario) salvó mi trasero. Seguí obteniendo 1 asumiendo que tenía las permanentes adecuadas. ¡Uf! fijo y solado. win : money_with_wings:
Pure.Krome
7

Como mencionó @jwalkerjr, debería deshacerse de las conexiones en código (si la agrupación de conexiones está habilitada, simplemente se devuelven al grupo de conexiones). La forma prescrita de hacer esto es usando la usingdeclaración ' ':

// 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
fuente
El autor de la pregunta mencionó que estaban usando PHP, por lo que el ejemplo de código puede no ser apropiado para ellos. El recolector de basura debería limpiar automáticamente las conexiones de SQL Server no persistentes cuando no haya más referencias a ellas (y todas las referencias se eliminarían al final del ciclo de la página), pero tal vez el autor de la pregunta esté usando conexiones persistentes, lo que requiere una conexión inteligente reutilizar.
Paul d'Aoust
5

Use esto para obtener un recuento preciso para cada grupo de conexiones (asumiendo que cada proceso de usuario / host usa la misma cadena de conexión)

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
fuente
4

Sé que esto es antiguo, pero pensé que sería una buena idea actualizarlo. Si se necesita un recuento preciso, la columna ECID probablemente también debería filtrarse. Un SPID con subprocesos paralelos puede aparecer varias veces en sysprocesses y el filtrado de ECID = 0 devolverá el subproceso 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
fuente
0

ver sp_who te brinda más detalles que solo ver el número de conexiones

en tu caso yo haría algo como esto

 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
fuente
0

Basado en el conocimiento de MS SQL: cómo saber las conexiones de bases de datos SQL abiertas y las ocupadas en qué host.

Usando la siguiente consulta, encontrará la base de datos de la lista, el nombre del host y el número total de recuento de conexiones abiertas, en función de eso, tendrá una idea de qué host ha ocupado la conexión 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
fuente
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
fuente