2012-06-24 34 views
9

Tôi chạy truy vấn này trong cơ sở dữ liệu của tôi:Số kết nối mở và ý nghĩa của tình trạng ngủ của một kết nối

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' 

Tôi muốn biết tổng số các kết nối đến cơ sở dữ liệu của tôi. Tổng truy vấn đầu tiên và số lượng truy vấn thứ hai bằng nhau nhưng truy vấn thứ ba trả về một số hàng khác nhau.

Tôi muốn biết truy vấn thứ ba trả về là gì? Tôi thấy một số trạng thái 'trong kết quả của truy vấn thứ ba là sleeping. Điều đó có nghĩa là gì? Là kết nối nhàn rỗi, hoặc nó đã sẵn sàng trong hồ bơi? Điều gì có nghĩa là nếu tôi có nhiều kết nối sleeping trong kết quả của tôi?

nhờ

+0

Tôi không nghĩ rằng 'ngủ' sẽ được trả về bởi truy vấn thứ ba trừ khi bạn chạy nó mà không chỉ định' 'hoạt động'' ... –

Trả lời

11

Một trạng thái của sleeping nghĩa phiên được kết nối nhưng không chủ động chạy bất cứ điều gì (ví dụ định nghĩa đơn giản nhất, trong khi có lẽ không chính xác 100%, đó là không có gì để mà session_id trong sys.dm_exec_requests là).

sp_who2 'active' lọc ra bất kỳ dịch vụ spid mà có một trạng thái của sleeping hoặc có một lệnh cuối cùng của AWAITING COMMAND, LAZY WRITER hoặc CHECKPOINT SLEEP. Không, tôi không nhớ những gì sp_who2 làm; Tôi chỉ đơn giản nhìn vào mã nguồn:

EXEC master..sp_helptext sp_who2; 

Lưu ý rằng sp_who2 được cung cấp tài liệu và không được hỗ trợ, và sysprocesses bị phản đối và hiện đang có mặt chỉ vì những lý do tương thích ngược. Bạn sẽ được phục vụ tốt hơn, tôi nghĩ rằng, với một thủ tục như Adam Machanic's sp_whoisactive. Hoặc ít nhất biết cách sử dụng DMV hiện đại hơn như sys.dm_exec_sessionssys.dm_exec_requests.

EDIT

tôi nên thêm khuyến cáo không may rằng DMVs hiện đại hơn vẫn không đúng cách tiết lộ cơ sở dữ liệu (s) có liên quan. Nhưng nó thực sự có ý nghĩa gì? Nếu bạn có truy vấn như sau:

USE database_A; 
GO 

SELECT [column] FROM database_B.dbo.[table] 
    UNION ALL 
SELECT [column] FROM database_C.dbo.[table]; 

Bạn muốn nhận được ID cơ sở dữ liệu nào trong phiên đó trong khi truy vấn này đang chạy? Tôi sẽ để nó như một bài tập cho người đọc để xác định điều gì thực sự xảy ra. Dài câu chuyện ngắn, đó không phải là xem/cột bạn muốn dựa vào để biết cơ sở dữ liệu hiện đang được "xúc động".

+0

Kết nối trung bình 'ngủ' không đóng sau khi thực hiện lệnh cuối cùng? – Arian

+0

@Kerezo không nhất thiết; xem xét kết nối tổng hợp, nơi kết nối được sử dụng lại ngay cả khi ứng dụng đóng kết nối một cách rõ ràng - điều này chỉ trả về kết nối với nhóm, nhưng cắt đứt kết nối với SQL Server và xóa hàng khỏi 'sys.dm_exec_sessions' sẽ đánh bại mục đích của kết nối tổng hợp. –

Các vấn đề liên quan