So ermitteln Sie die Gesamtzahl der offenen / aktiven Verbindungen in MS SQL Server 2005

89

Meine PHP / MS SQL Server 2005 / Win 2003-Anwendung reagiert gelegentlich nicht mehr, die Speicher- / CPU-Auslastung steigt nicht an. Wenn ich versuche, eine neue Verbindung über SQL Management Studio zu öffnen, hängt sie nur im Dialogfeld "Verbindung öffnen". So ermitteln Sie die Gesamtzahl der aktiven Verbindungen ms sql server 2005

Andy Lester
quelle

Antworten:

267

Dies zeigt die Anzahl der Verbindungen pro DB:

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

Und das ergibt die Summe:

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

Wenn Sie weitere Details benötigen, führen Sie Folgendes aus:

sp_who2 'Active'

Hinweis: Das verwendete SQL Server-Konto benötigt die Rolle "sysadmin" (andernfalls wird nur eine einzelne Zeile und als Ergebnis eine Anzahl von 1 angezeigt).

Mitch Wheat
quelle
1
Wunderbar, vielen Dank. Starten Sie für Anfänger wie mich SQL Server Management Studio, klicken Sie mit der rechten Maustaste auf Ihre Datenbank, wählen Sie Neue Abfrage aus, fügen Sie diese ein und klicken Sie auf die Schaltfläche "! Go".
8
Dies sollte weder akzeptiert noch die Antwort mit der höchsten Stimme sein, da sie einfach falsch ist. Sie können sich nur dann auf die zurückgegebene Nummer verlassen, wenn Sie als angemeldet sind sa. Wenn Sie als Nicht-Sa-Benutzer angemeldet sind, wird 1 angezeigt, was nicht für die tatsächlichen Verbindungen repräsentativ ist.
Ajeh
3
@ajeh: Es ist implizit, dass Sie über ausreichende Berechtigungen verfügen, um die Aufgabe auszuführen. Ihr Kommentar ist überflüssig.
Mitch Wheat
2
@ IEBasara: Es ist implizit. Warum sollten Sie erwarten, dass ein Nicht-Administrator solche Informationen anzeigen kann?
Mitch Wheat
1
Spät zur Party .. aber .. die sysadminbenötigte Rolle (Kommentar bearbeiten) hat meinen Buttox gerettet. Ich bekam immer 1, vorausgesetzt ich hatte die richtigen Dauerwellen. Puh! fest und sovled. win : money_with_wings:
Pure.Krome
7

Wie bei @jwalkerjr erwähnt, sollten Sie Verbindungen im Code entsorgen (wenn das Verbindungspooling aktiviert ist, werden sie nur an den Verbindungspool zurückgegeben). Die vorgeschriebene Methode hierfür ist die Verwendung der usingAnweisung ' ':

// 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);
            }
        }
    }
}
Mitch Wheat
quelle
Der Fragesteller erwähnte, dass sie PHP verwenden, daher ist das Codebeispiel möglicherweise nicht für sie geeignet. Der Garbage Collector sollte nicht persistente SQL Server-Verbindungen automatisch bereinigen, wenn keine Verweise mehr auf sie vorhanden sind (und alle Verweise am Ende des Seitenzyklus gelöscht werden). Möglicherweise verwendet der Fragesteller jedoch persistente Verbindungen, für die eine intelligente Verbindung erforderlich ist Wiederverwendung.
Paul d'Aoust
5

Verwenden Sie diese Option, um eine genaue Zählung für jeden Verbindungspool zu erhalten (vorausgesetzt, jeder Benutzer- / Hostprozess verwendet dieselbe Verbindungszeichenfolge).

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
realstrategos
quelle
4

Ich weiß, dass dies alt ist, dachte aber, es wäre eine gute Idee, es zu aktualisieren. Wenn eine genaue Zählung erforderlich ist, sollte wahrscheinlich auch die Spalten-ECID gefiltert werden. Eine SPID mit parallelen Threads kann in Systemprozessen mehrmals angezeigt werden. Durch Filtern von ECID = 0 wird der primäre Thread für jede SPID zurückgegeben.

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
sqldba.today
quelle
0

siehe sp_who gibt Ihnen mehr Details als nur die Anzahl der Verbindungen

in deinem Fall würde ich so etwas tun

 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'
Mina Gabriel
quelle
0

MS SQL wissensbasiert - Erfahren Sie, welche offenen SQL-Datenbankverbindungen auf welchem ​​Host belegt sind.

Mit der folgenden Abfrage finden Sie die Listendatenbank, den Hostnamen und die Gesamtzahl der offenen Verbindungen, basierend darauf, dass Sie eine Vorstellung davon haben, welcher Host die SQL-Verbindung belegt hat.

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
Tarun Harkinia
quelle
0
SELECT
[DATABASE] = DB_NAME(DBID), 
OPNEDCONNECTIONS =COUNT(DBID),
[USER] =LOGINAME
FROM SYS.SYSPROCESSES
GROUP BY DBID, LOGINAME
ORDER BY DB_NAME(DBID), LOGINAME
FatemehEbrahimiNik
quelle