2012-06-24 17 views
9

me encontré con esta consulta en mi base de datos:número de conexiones abiertas y el significado de dormir estado de una conexión

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

--------------------------------------------------- 
SELECT COUNT(dbid) as TotalConnections 
FROM sys.sysprocesses 
WHERE 
dbid > 0 
--------------------------------------------------- 
exec sp_who2 'Active' 

que quieren saber el número total de conexiones a mi base de datos. La suma de la primera consulta y la cantidad de la segunda consulta son iguales, pero la tercera consulta devuelve un número diferente de filas.

Quiero saber qué devuelve la tercera consulta? Veo que parte del estado 'en el resultado de la tercera consulta es sleeping. ¿Qué significa esto? ¿La conexión está inactiva o está lista en el grupo? ¿Qué significa si tengo muchas conexiones sleeping en mi resultado?

gracias

+0

No creo que 'sleeping' sea devuelto por la tercera consulta a menos que lo ejecute sin especificar' 'active'' ... –

Respuesta

11

Un estado de sleeping significa que la sesión está conectado pero no se ejecuta nada activamente (por ejemplo, la definición más simple, aunque quizá no sea fiable al 100%, es que no hay nada para que session_id en sys.dm_exec_requests).

sp_who2 'active' filtra cualquier SPID que tiene un estado de sleeping o tiene una última orden de AWAITING COMMAND, LAZY WRITER o CHECKPOINT SLEEP. No, no memoricé lo que hace sp_who2; Yo simplemente miraba el código fuente:

EXEC master..sp_helptext sp_who2; 

Tenga en cuenta que sp_who2 es indocumentado y sin apoyo, y sysprocesses es obsoleto y actualmente está presente sólo por razones de compatibilidad hacia atrás. Le serviré mejor, creo, con un procedimiento como Adam Machanic's sp_whoisactive. O al menos saber cómo usar los DMV más modernos como sys.dm_exec_sessions y sys.dm_exec_requests.

EDITAR

debo añadir la desafortunada advertencia de que los DMV más modernos todavía no revelan adecuadamente la base de datos (s) en cuestión. Pero, ¿qué significa realmente de todos modos? Si usted tiene una consulta como esta:

USE database_A; 
GO 

SELECT [column] FROM database_B.dbo.[table] 
    UNION ALL 
SELECT [column] FROM database_C.dbo.[table]; 

Qué Identificación base de datos se puede esperar conseguir se refleja en sys.sysprocesses.dbid para esa sesión, mientras que esta consulta se está ejecutando? Lo dejaré como un ejercicio para que el lector determine qué sucede en realidad. Para resumir, esa no es la vista/columna en la que desea confiar para saber qué bases de datos están siendo "tocadas" actualmente.

+0

¿' Dormir 'significa que la conexión no se cierra después de ejecutar el último comando? – Arian

+0

@ Kerezo no necesariamente; considere la agrupación de conexiones, donde las conexiones se reutilizan incluso si la aplicación cierra la conexión explícitamente; esto simplemente devuelve la conexión al grupo, pero cortar la conexión a SQL Server y eliminar la fila de 'sys.dm_exec_sessions' vencería el propósito de agrupación de conexiones. –

Cuestiones relacionadas