13

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

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的结果中有很多连接,这意味着什么?

谢谢

4

1 回答 1

14

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

sp_who2 'active'过滤掉任何状态为sleeping或最后一个命令为 或AWAITING COMMANDLAZY WRITERspid CHECKPOINT SLEEP。不,我没有记住是什么sp_who2;我只是看了一下源代码:

EXEC master..sp_helptext sp_who2;

请注意,这sp_who2是未记录且不受支持的,并且 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];

sys.sysprocesses.dbid在此查询运行时,您希望该会话反映什么数据库 ID ?我将把它作为练习留给读者来确定实际发生的情况。长话短说,这不是您想要依赖的视图/列来了解当​​前正在“触及”哪些数据库。

于 2012-06-24T18:06:04.000 回答