如何确定MS SQL Server 2005中打开/活动连接的总数


90

我的PHP / MS Sql Server 2005 / win 2003应用程序有时变得非常无响应,内存/ cpu使用率不会达到峰值。如果我尝试从sql Management Studio中打开任何新连接,则它只会挂在“打开连接”对话框中。如何确定活动连接总数(ms sql server 2005)

Answers:


268

这显示每个数据库的连接数:

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

如果需要更多详细信息,请运行:

sp_who2 'Active'

注意:所使用的SQL Server帐户需要'sysadmin'角色(否则,它将仅显示一行并且结果为1)


1
很好,非常感谢。对于像我这样的新手,请启动SQL Server Management Studio,右键单击数据库,选择“新建查询”,将其粘贴在其中,然后单击“!Go”按钮。

8
这既不应该接受,也不应该是最高投票的答案,因为这完全是不正确的。如果您以身份登录,则只能依靠返回的号码sa。如果您以非sa用户身份登录,则将看到1,并且该数字不代表实际的连接。
ajeh 2014年

3
@ajeh:这暗含您具有足够的权限来执行任务。您的评论是多余的。
米奇·

2
@ IEBasara:它是隐式的。您为什么希望非管理员能够查看此类信息?
米奇小麦

1
晚了晚会..但是.. sysadmin所需的角色(编辑评论)救了我的臀部。假设我的烫发正确,我会一直得到1。!修复并解决。:money_with_wings:
Pure.Krome

7

如@jwalkerjr所述,您应该使用代码来处理连接(如果启用了连接池,则它们只会返回到连接池中)。规定的方法是使用' using'语句:

// Execute stored proc to read data from repository
using (SqlConnection conn = new SqlConnection(this.connectionString))
{
    using (SqlCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = "LoadFromRepository";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@ID", fileID);

        conn.Open();
        using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
        {
            if (rdr.Read())
            {
                filename = SaveToFileSystem(rdr, folderfilepath);
            }
        }
    }
}

询问者提到他们正在使用PHP,因此代码示例可能不适合他们。当没有更多的非持久SQL Server连接引用时(并且所有引用将在页面周期结束时被删除),垃圾收集器应自动清除它们,但可能是提问者正在使用持久连接,这需要智能连接重用。
Paul d'Aoust 2014年

5

使用它来获得每个连接池的准确计数(假设每个用户/主机进程使用相同的连接字符串)

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

4

我知道这很旧,但是认为更新是个好主意。如果需要准确的计数,则可能还应过滤ECID列。具有并行线程的SPID可以在sysprocesses中显示多次,并且过滤ECID = 0将返回每个SPID的主线程。

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


0

请参见sp_who,它为您提供了更多的细节,而不仅仅是看到连接数

在你的情况下,我会做这样的事情

 DECLARE @temp TABLE(spid int , ecid int, status varchar(50),
                     loginname varchar(50),   
                     hostname varchar(50),
blk varchar(50), dbname varchar(50), cmd varchar(50), request_id int) 
INSERT INTO @temp  

EXEC sp_who

SELECT COUNT(*) FROM @temp WHERE dbname = 'DB NAME'

0

基于MS SQL的知识-如何知道打开的SQL数据库连接以及在哪个主机上占用。

使用下面的查询,您将找到列表数据库,主机名和打开的连接总数,基于此您将了解哪个主机占用了SQL连接。

SELECT DB_NAME(dbid) as DBName, hostname ,COUNT(dbid) as NumberOfConnections
FROM sys.sysprocesses with (nolock) 
WHERE dbid > 0 
and len(hostname) > 0 
--and DB_NAME(dbid)='master' /* Open this line to filter Database by Name */
Group by DB_NAME(dbid),hostname
order by DBName

0
SELECT
[DATABASE] = DB_NAME(DBID), 
OPNEDCONNECTIONS =COUNT(DBID),
[USER] =LOGINAME
FROM SYS.SYSPROCESSES
GROUP BY DBID, LOGINAME
ORDER BY DB_NAME(DBID), LOGINAME
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.