MS SQL Server 2005에서 열린 / 활성 연결의 총 수를 확인하는 방법


90

내 PHP / MS Sql Server 2005 / win 2003 응용 프로그램이 때때로 매우 응답하지 않고 메모리 / cpu 사용량이 급증하지 않습니다. SQL Management Studio에서 새 연결을 열려고하면 연결 열기 대화 상자에서 중단됩니다. 총 활성 연결 수를 결정하는 방법 ms SQL Server 2005

답변:


268

각 DB 당 연결 수를 보여줍니다.

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

3
@ajeh : 작업을 수행 할 수있는 충분한 권한이 있다는 것은 암시 적입니다. 귀하의 의견이 중복됩니다.
Mitch Wheat

2
@ IEBasara : 암묵적입니다. 관리자가 아닌 사람이 이러한 정보를 볼 수있는 이유는 무엇입니까?
Mitch Wheat

1
파티에 sysadmin늦었지만 .. 필요한 역할 (댓글 편집)이 내 엉덩이를 구했다. 나는 내가 올바른 파마를 가지고 있다고 가정하고 계속 1을 얻었습니다. 휴! 고정되고 절망적입니다. win : money_with_wings :
Pure.Krome 2015 년

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 연결에 대한 참조가 더 이상 없을 때 자동으로 정리해야하지만 (페이지주기가 끝날 때 모든 참조가 삭제됨) asker가 지능형 연결이 필요한 영구 연결을 사용하고있을 수 있습니다. 재사용.
Paul d' Aoust

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.