Cara menentukan jumlah total koneksi terbuka / aktif di ms sql server 2005


90

Aplikasi PHP / MS Sql Server 2005 / win 2003 saya terkadang menjadi sangat tidak responsif, penggunaan memori / cpu tidak melonjak. Jika saya mencoba membuka koneksi baru dari studio manajemen sql, maka itu hanya hang di kotak dialog koneksi terbuka. bagaimana cara deterime jumlah koneksi aktif ms sql server 2005

Jawaban:


269

Ini menunjukkan jumlah koneksi per setiap DB:

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

Dan ini memberikan total:

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

Jika Anda membutuhkan lebih banyak detail, jalankan:

sp_who2 'Active'

Catatan: Akun SQL Server yang digunakan membutuhkan peran 'sysadmin' (jika tidak maka hanya akan menampilkan satu baris dan hitungan 1 sebagai hasilnya)


1
Luar biasa terima kasih banyak. Untuk pemula seperti saya, jalankan SQL Server Management Studio, klik kanan pada database Anda, pilih Kueri Baru, tempelkan ini dan klik tombol "! Go".

8
Ini seharusnya tidak diterima, atau jawaban dengan suara terbanyak karena itu tidak benar. Anda hanya dapat mengandalkan nomor yang dikembalikan jika Anda masuk sebagai sa. Jika Anda login sebagai pengguna non-sa, Anda akan melihat 1 dan itu tidak akan mewakili koneksi yang sebenarnya.
ajeh

3
@ajeh: Secara implisit Anda memiliki izin yang memadai untuk menjalankan tugas. Komentar Anda berlebihan.
Mitch Wheat

2
@ IEBasara: Ini implisit. Mengapa Anda mengharapkan non-admin dapat melihat informasi seperti itu?
Mitch Wheat

1
Terlambat ke pesta .. tapi .. sysadminperan yang diperlukan (edit komentar) menyelamatkan pantat saya. Saya terus mendapatkan 1 dengan asumsi saya memang memiliki perm yang benar. Fiuh! diperbaiki dan dibangkitkan. menang : money_with_wings:
Pure.Krome

7

Seperti yang disebutkan @jwalkerjr, Anda harus membuang koneksi dalam kode (jika penggabungan koneksi diaktifkan, mereka baru saja dikembalikan ke kumpulan koneksi). Cara yang ditentukan untuk melakukan ini adalah menggunakan pernyataan ' 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);
            }
        }
    }
}

Penanya menyebutkan bahwa mereka menggunakan PHP, jadi contoh kode mungkin tidak sesuai untuk mereka. Pengumpul sampah harus secara otomatis membersihkan koneksi SQL Server yang tidak persisten ketika tidak ada lagi referensi ke sana (dan semua referensi akan dihapus di akhir siklus halaman), tetapi mungkin penanya menggunakan koneksi persisten, yang memerlukan koneksi cerdas penggunaan kembali.
Paul d'Aoust

5

Gunakan ini untuk mendapatkan jumlah yang akurat untuk setiap kumpulan koneksi (dengan asumsi setiap proses pengguna / host menggunakan string koneksi yang sama)

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

Saya tahu ini sudah tua, tetapi saya pikir akan lebih baik untuk memperbaruinya. Jika penghitungan yang akurat diperlukan, ECID kolom mungkin juga harus difilter. SPID dengan utas paralel dapat muncul beberapa kali dalam sysprocesses dan memfilter ECID = 0 akan mengembalikan utas utama untuk setiap 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

lihat sp_who itu memberi Anda lebih banyak detail daripada hanya melihat jumlah koneksi

dalam kasus Anda, saya akan melakukan sesuatu seperti ini

 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

Berbasis pengetahuan MS SQL - Bagaimana mengetahui koneksi database SQL terbuka dan menempati host mana.

Menggunakan query di bawah ini Anda akan menemukan database daftar, nama Host dan jumlah total koneksi terbuka, berdasarkan itu Anda akan tahu, host mana yang telah menempati koneksi 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.