Jak określić całkowitą liczbę otwartych / aktywnych połączeń na serwerze MS sql 2005


90

Moja aplikacja PHP / MS Sql Server 2005 / win 2003 czasami bardzo przestaje odpowiadać, użycie pamięci / procesora nie gwałtownie rośnie. Jeśli spróbuję otworzyć nowe połączenie z SQL Management Studio, po prostu zawiesza się w oknie dialogowym otwierania połączenia. jak odstraszyć całkowitą liczbę aktywnych połączeń ms sql server 2005

Odpowiedzi:


269

Pokazuje liczbę połączeń na każdą DB:

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

A to daje sumę:

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

Jeśli potrzebujesz więcej szczegółów, uruchom:

sp_who2 'Active'

Uwaga: używane konto SQL Server wymaga roli `` sysadmin '' (w przeciwnym razie wyświetli tylko jeden wiersz i wynik 1)


1
Cudownie dziękuję bardzo. Dla nowicjuszy, takich jak ja, uruchom SQL Server Management Studio, kliknij prawym przyciskiem myszy swoją bazę danych, wybierz Nowa kwerenda, wklej to i kliknij przycisk „! Go”.

8
Nie należy tego akceptować ani najwyżej głosowanej odpowiedzi, ponieważ jest po prostu niepoprawna. Możesz polegać na zwróconym numerze tylko wtedy, gdy jesteś zalogowany jako sa. Jeśli jesteś zalogowany jako użytkownik inny niż sa, zobaczysz 1, który nie będzie reprezentował rzeczywistych połączeń.
ajeh

3
@ajeh: Domniemane jest, że masz wystarczające uprawnienia do wykonania zadania. Twój komentarz jest zbędny.
Mitch Wheat

2
@ IEBasara: To niejawne. Dlaczego miałbyś oczekiwać, że osoba niebędąca administratorem będzie mogła przeglądać takie informacje?
Mitch Wheat

1
Spóźniony na imprezę… ale… sysadminwymagana rola (edytuj komentarz) uratowała mój tyłek. Ciągle otrzymywałem 1 zakładając, że miałem odpowiednią trwałą. Uff! naprawiono i naprawiono. win : money_with_wings:
Pure.Krome

7

Jak wspomniał @jwalkerjr, powinieneś pozbywać się połączeń w kodzie (jeśli pula połączeń jest włączona, są one po prostu zwracane do puli połączeń). Zalecanym sposobem na to jest użycie instrukcji „ 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);
            }
        }
    }
}

Pytający wspomniał, że używają PHP, więc przykładowy kod może nie być dla nich odpowiedni. Moduł odśmiecania pamięci powinien automatycznie czyścić nietrwałe połączenia SQL Server, gdy nie ma już do nich odwołań (a wszystkie odwołania zostaną porzucone na końcu cyklu strony), ale może pytający używa trwałych połączeń, które wymagają inteligentnego połączenia ponowne użycie.
Paul d'Aoust

5

Użyj tego, aby uzyskać dokładną liczbę dla każdej puli połączeń (zakładając, że każdy proces użytkownika / hosta używa tych samych parametrów połączenia)

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

Wiem, że to jest stare, ale pomyślałem, że warto zaktualizować. Jeśli potrzebne jest dokładne zliczenie, prawdopodobnie należy przefiltrować również kolumnę ECID. Identyfikator SPID z równoległymi wątkami może pojawiać się wiele razy w procesach sysproces, a filtrowanie ECID = 0 zwróci główny wątek dla każdego identyfikatora 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

zobacz sp_who daje więcej szczegółów niż tylko wyświetlenie liczby połączeń

w twoim przypadku zrobiłbym coś takiego

 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

Bazująca na wiedzy MS SQL - jak poznać otwarte połączenia z bazą danych SQL i zajęte na którym hoście.

Za pomocą poniższego zapytania znajdziesz listę bazy danych, nazwę hosta oraz łączną liczbę otwartych połączeń, na podstawie których zorientujesz się, który host zajmuje połączenie 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.