2012-06-24 10 views
9

ho eseguito questa query nel mio database:numero di connessioni aperte e il significato di dormire stato di una connessione

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' 

voglio sapere il numero totale di connessioni al mio database. La somma della prima query e l'importo della seconda query sono uguali ma la terza query restituisce un numero diverso di righe.

Desidero sapere che cosa restituisce la terza query? Vedo che alcuni degli stati 'nel risultato della terza query sono sleeping. Cosa significa questo? La connessione è inattiva o è pronta in piscina? Che cosa significa se ho più connessioni sleeping nel mio risultato?

grazie

+0

Non credo che 'sleeping' sarà restituito dalla terza query a meno che non lo si esegua senza specificare' 'active'' ... –

risposta

11

Lo stato sleeping significa la sessione è collegato ma non in esecuzione attivamente nulla (ad esempio, la definizione più semplice, mentre forse non al 100% esatto, è che non c'è nulla per cui session_id in sys.dm_exec_requests).

sp_who2 'active' filtra qualsiasi SPID che ha uno status di sleeping o ha un ultimo comando di AWAITING COMMAND, LAZY WRITER o CHECKPOINT SLEEP. No non ho memorizzato cosa fa sp_who2; Ho semplicemente guardato il codice sorgente:

EXEC master..sp_helptext sp_who2; 

noti che sp_who2 non è documentato e supportato, e sysprocesses è obsoleto e attualmente presente solo per ragioni di compatibilità all'indietro. Sarai meglio servito, credo, con una procedura come Adam Machanic's sp_whoisactive. O per lo meno sapere come usare i DMV più moderni come sys.dm_exec_sessions e sys.dm_exec_requests.

EDIT

devo aggiungere lo sfortunato disclaimer che i DMV più moderne ancora non rivelano correttamente il database (s) coinvolti. Ma cosa significa in ogni caso? Se si dispone di una query come questa:

USE database_A; 
GO 

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

Che id del database si aspetta andranno riflette in sys.sysprocesses.dbid per quella sessione, mentre la query è in esecuzione? Lascerò come esercizio al lettore per determinare cosa succede realmente. Per farla breve, non è la vista/colonna su cui si vuole fare affidamento per sapere quali database sono attualmente "toccati".

+0

Does 'sleeping' significa connessione non chiusa dopo l'esecuzione dell'ultimo comando? – Arian

+0

@Kerezo non necessariamente; considerare il pool di connessioni, in cui le connessioni vengono riutilizzate anche se l'applicazione chiude esplicitamente la connessione - ciò restituisce semplicemente la connessione al pool, ma interrompendo la connessione a SQL Server e rimuovendo la riga da 'sys.dm_exec_sessions' si annullerebbe lo scopo di pool di connessioni. –

Problemi correlati