Ms sql server 2005'teki toplam açık / aktif bağlantı sayısı nasıl belirlenir


90

PHP / MS Sql Server 2005 / win 2003 Uygulamam bazen çok yanıt vermiyor, bellek / cpu kullanımı ani artış göstermiyor. Sql yönetim stüdyosundan herhangi bir yeni bağlantı açmaya çalışırsam, bağlantı açık iletişim kutusunda asılı kalıyor. toplam aktif bağlantı sayısı nasıl belirlenir ms sql server 2005

Yanıtlar:


269

Bu, her DB için bağlantı sayısını gösterir:

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

Ve bu toplamı verir:

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

Daha fazla ayrıntıya ihtiyacınız varsa, şunu çalıştırın:

sp_who2 'Active'

Not: Kullanılan SQL Server hesabının 'sysadmin' rolüne ihtiyacı vardır (aksi takdirde yalnızca tek bir satır ve sonuç olarak 1 sayısını gösterir)


1
Harika, çok teşekkür ederim. Benim gibi acemiler için SQL Server Management Studio'yu başlatın, veritabanınıza sağ tıklayın, Yeni Sorgu seçin, bunu yapıştırın ve "! Git" düğmesine tıklayın.

8
Bu, yanlış olduğu için ne kabul edilmeli ne de en yüksek oyu alan cevap. Yalnızca olarak oturum açtıysanız iade edilen numaraya güvenebilirsiniz sa. Sa olmayan bir kullanıcı olarak oturum açtıysanız, 1 görürsünüz ve bu gerçek bağlantıları temsil etmez.
ajeh

3
@ajeh: Görevi yerine getirmek için yeterli izne sahip olduğunuz örtük. Yorumunuz gereksizdir.
Mitch Wheat

2
@ IEBasara: Örtük. Yönetici olmayan birinin bu tür bilgileri görüntüleyebilmesini neden beklersiniz?
Mitch Wheat

1
Partiye geç kaldım .. ama .. sysadmingerekli rol (yorumu düzenle) buttoksumu kurtardı. Doğru izinlere sahip olduğumu varsayarak 1 almaya devam ettim. Vay be! sabit ve tırtıklı. win : money_with_wings:
Pure.Krome

7

@Jwalkerjr'in bahsettiği gibi, koddaki bağlantıları elden çıkarmanız gerekir (bağlantı havuzu etkinleştirilmişse, bunlar bağlantı havuzuna döndürülür). Bunu yapmanın öngörülen yolu ' using' ifadesini kullanmaktır:

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

Soru soran kişi PHP kullandığını belirtti, bu nedenle kod örneği onlar için uygun olmayabilir. Çöp toplayıcı, daha fazla referans olmadığında kalıcı olmayan SQL Server bağlantılarını otomatik olarak temizlemelidir (ve sayfa döngüsünün sonunda tüm referanslar bırakılacaktır), ancak soran kişi akıllı bağlantı gerektiren kalıcı bağlantılar kullanıyor olabilir yeniden kullanım.
Paul d'Aoust

5

Her bağlantı havuzu için doğru bir sayı elde etmek için bunu kullanın (her kullanıcı / ana bilgisayar işleminin aynı bağlantı dizesini kullandığı varsayılarak)

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

Bunun eski olduğunu biliyorum, ancak güncellemenin iyi bir fikir olacağını düşündüm. Doğru bir sayım gerekiyorsa, bu durumda ECID sütunu da muhtemelen filtrelenmelidir. Paralel iş parçacıkları olan bir SPID, sysprocesses'te birden çok kez görünebilir ve ECID = 0'a filtre uygulandığında, her SPID için birincil iş parçacığı döndürülür.

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

sadece bağlantı sayısını görmekten daha fazla ayrıntı veren sp_who'ya bakın

senin durumunda böyle bir şey yapardım

 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

MS SQL bilgisine dayalı - Açık SQL veritabanı bağlantıları nasıl bilinir ve hangi ana bilgisayarda kullanılır.

Aşağıdaki sorguyu kullanarak liste veritabanını, Ana bilgisayar adını ve hangi ana bilgisayarın SQL bağlantısını meşgul ettiğine dair fikrinize bağlı olarak toplam açık bağlantı sayısını bulacaksınız.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.