我在我的数据库中运行了这个查询:
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
个连接,这意味着什么?
感谢
答案 0 :(得分:12)
状态sleeping
表示会话已连接但未主动运行任何内容(例如,最简单的定义,虽然可能不是100%准确,但session_id
中sys.dm_exec_requests
没有任何内容}})。
sp_who2 'active'
过滤掉状态为sleeping
或最后一个AWAITING COMMAND
,LAZY WRITER
或CHECKPOINT SLEEP
的spid。不,我没有记住sp_who2
所做的事情;我只是看了一下源代码:
EXEC master..sp_helptext sp_who2;
请注意,sp_who2
未记录且不受支持,并且不推荐使用sysprocesses,并且仅出于向后兼容性原因而提供sysprocesses。我认为,通过像Adam Machanic's sp_whoisactive这样的程序,您将获得更好的服务。或者至少知道如何使用更现代的DMV,如sys.dm_exec_sessions
和sys.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
中?我会把它作为练习留给读者来确定实际发生的事情。简而言之,这不是您想要依赖的视图/列,以了解当前正在“触及”哪些数据库。