打开的连接数和连接的休眠状态的含义

Ari*_*ian 12 sql sql-server sql-server-2008

我在我的数据库中运行了这个查询:

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' 
Run Code Online (Sandbox Code Playgroud)

我想知道我的数据库的连接总数.第一个查询和第二个查询的数量之和相等,但第三个查询返回不同的行数.

我想知道第三个查询返回什么?我在第三个查询的结果中看到了一些状态sleeping.这是什么意思?连接是空闲的,还是在池中准备好了?如果sleeping我的结果中有很多联系,这意味着什么?

谢谢

Aar*_*and 13

的状态sleeping来会话连接,但不主动运行任何东西(比如最简单的定义,虽然可能不是100%准确的,是没有什么针对session_idsys.dm_exec_requests).

sp_who2 'active'过滤掉状态为sleeping或具有最后一个命令的任何spid AWAITING COMMAND,LAZY WRITERCHECKPOINT SLEEP.不,我没有记住是sp_who2做什么的; 我只是看了一下源代码:

EXEC master..sp_helptext sp_who2;
Run Code Online (Sandbox Code Playgroud)

请注意,该sp_who2文档未记录且不受支持,并且不推荐使用sysprocesses,并且仅出于向后兼容性原因而提供sysprocesses.我认为,通过像Adam Machanic的sp_whoisactive这样的程序,你会得到更好的服务.或者至少知道如何使用更现代的DMV sys.dm_exec_sessionssys.dm_exec_requests.

编辑

我应该补充一个不幸的免责声明,即更现代的DMV仍然没有正确揭示所涉及的数据库.但它究竟意味着什么呢?如果您有这样的查询:

USE database_A;
GO

SELECT [column] FROM database_B.dbo.[table] 
  UNION ALL
SELECT [column] FROM database_C.dbo.[table];
Run Code Online (Sandbox Code Playgroud)

在您sys.sysprocesses.dbid运行此查询时,您期望在该会话中反映出哪个数据库ID ?我会把它作为练习留给读者来确定实际发生的事情.简而言之,这不是您想要依赖的视图/列,以了解当前正在"触及"哪些数据库.

  • `sleeping` 是否意味着在执行最后一个命令后连接没有关闭? (2认同)