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

时间:2012-06-24 18:01:16

标签: 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' 

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

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

感谢

1 个答案:

答案 0 :(得分:12)

状态sleeping表示会话已连接但未主动运行任何内容(例如,最简单的定义,虽然可能不是100%准确,但session_idsys.dm_exec_requests没有任何内容}})。

sp_who2 'active'过滤掉状态为sleeping或最后一个AWAITING COMMANDLAZY WRITERCHECKPOINT SLEEP的spid。不,我没有记住sp_who2所做的事情;我只是看了一下源代码:

EXEC master..sp_helptext sp_who2;

请注意,sp_who2未记录且不受支持,并且不推荐使用sysprocesses,并且仅出于向后兼容性原因而提供sysprocesses。我认为,通过像Adam Machanic's 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];

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