Cách xác định tổng số kết nối đang mở / hoạt động trong ms sql server 2005


90

Ứng dụng PHP / MS Sql Server 2005 / win 2003 của tôi đôi khi rất không phản hồi, việc sử dụng bộ nhớ / cpu không tăng đột biến. Nếu tôi cố gắng mở bất kỳ kết nối mới nào từ studio quản lý sql, thì nó chỉ bị treo ở hộp thoại kết nối đang mở. làm thế nào để giảm tổng số kết nối đang hoạt động trên ms sql server 2005

Câu trả lời:


268

Điều này cho thấy số lượng kết nối trên mỗi DB:

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

Và điều này cho tổng số:

SELECT 
    COUNT(dbid) as TotalConnections
FROM
    sys.sysprocesses
WHERE 
    dbid > 0

Nếu bạn cần thêm chi tiết, hãy chạy:

sp_who2 'Active'

Lưu ý: Tài khoản SQL Server được sử dụng cần có vai trò 'sysadmin' (nếu không, nó sẽ chỉ hiển thị một hàng duy nhất và kết quả là số 1)


1
Tuyệt vời, cảm ơn bạn rất nhiều. Đối với những người mới làm quen như tôi, hãy khởi động SQL Server Management Studio, nhấp chuột phải vào cơ sở dữ liệu của bạn, chọn New Query, dán nó vào và nhấp vào nút "! Go".

8
Điều này không được chấp nhận, cũng như câu trả lời được bình chọn cao nhất vì nó chỉ đơn giản là không chính xác. Bạn chỉ có thể dựa vào số được trả lại nếu bạn đăng nhập bằng sa. Nếu bạn đăng nhập với tư cách là người dùng không sa, bạn sẽ thấy 1 và đó sẽ không phải là đại diện cho các kết nối thực tế.
ajeh

3
@ajeh: Rõ ràng là bạn có đủ quyền để thực hiện nhiệm vụ. Nhận xét của bạn là thừa.
Mitch Wheat

2
@ IEBasara: Nó ngầm hiểu. Tại sao bạn lại mong đợi một người không phải là quản trị viên có thể xem những thông tin đó?
Mitch Wheat

1
Đến trễ bữa tiệc .. nhưng .. sysadminvai trò cần thiết (chỉnh sửa bình luận) đã cứu mông tôi. Tôi tiếp tục nhận được 1 giả sử rằng tôi đã có quyền lợi. Phù! cố định và bay bổng. win : money_with_wings:
Pure.Krome

7

Như @jwalkerjr đã đề cập, bạn nên loại bỏ các kết nối trong mã (nếu tính năng gộp kết nối được bật, chúng chỉ được trả về nhóm kết nối). Cách quy định để làm điều này là sử dụng usingcâu lệnh '':

// 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);
            }
        }
    }
}

Người hỏi cho biết họ đang sử dụng PHP, vì vậy mẫu mã có thể không phù hợp với họ. Trình thu gom rác sẽ tự động dọn dẹp các kết nối SQL Server không liên tục khi không còn tham chiếu đến chúng (và tất cả các tham chiếu sẽ bị loại bỏ vào cuối chu kỳ trang), nhưng có thể người hỏi đang sử dụng các kết nối liên tục, điều này yêu cầu kết nối thông minh tái sử dụng.
Paul d'Aoust

5

Sử dụng điều này để có được số lượng chính xác cho từng nhóm kết nối (giả sử mỗi quy trình người dùng / máy chủ sử dụng cùng một chuỗi kết nối)

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

Tôi biết điều này là cũ, nhưng tôi nghĩ rằng nó sẽ là một ý tưởng tốt để cập nhật. Nếu cần một số đếm chính xác, thì ECID cột có lẽ cũng nên được lọc. Một SPID với các luồng song song có thể hiển thị nhiều lần trong các xử lý hệ thống và việc lọc ECID = 0 sẽ trả về luồng chính cho mỗi 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

xem sp_who nó cung cấp cho bạn nhiều chi tiết hơn là chỉ xem số lượng kết nối

trong trường hợp của bạn, tôi sẽ làm một cái gì đó như thế này

 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

Dựa trên kiến ​​thức MS SQL - Làm thế nào để biết (các) kết nối cơ sở dữ liệu SQL đang mở và được sử dụng trên máy chủ nào.

Sử dụng truy vấn bên dưới, bạn sẽ tìm thấy danh sách cơ sở dữ liệu, tên máy chủ và tổng số kết nối đang mở, dựa vào đó bạn sẽ có ý tưởng, máy chủ nào đã chiếm kết nối 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.