Як визначити загальну кількість відкритих / активних з'єднань на сервері ms sql 2005


90

Мій додаток PHP / MS Sql Server 2005 / win 2003 іноді стає дуже невідповідним, використання пам'яті / процесора не стрибає. Якщо я намагаюся відкрити будь-яке нове підключення з sql management studio, воно просто зависає у діалоговому вікні відкритого підключення. Як визначити загальну кількість активних з'єднань MS SQL Server 2005

Відповіді:


268

Це показує кількість підключень для кожної БД:

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

Якщо вам потрібна детальна інформація, запустіть:

sp_who2 'Active'

Примітка. Для використовуваного облікового запису SQL Server потрібна роль 'sysadmin' (інакше він буде відображати лише один рядок та підрахунок 1 як результат)


1
Чудове спасибі. Для таких початківців, як я, запустіть SQL Server Management Studio, клацніть правою кнопкою миші на вашій базі даних, виберіть Новий запит, вставте його та натисніть кнопку "! Перейти".

8
Цю відповідь не слід прийняти, ані відповідь з найбільшою оцінкою, оскільки вона просто неправильна. Ви можете покластися на повернутий номер, лише якщо ви ввійшли як sa. Якщо ви ввійшли як не-користувач, ви побачите 1, і це не буде репрезентативно для фактичних з'єднань.
ajeh

3
@ajeh: Мається на увазі, що у вас є достатньо дозволів для виконання завдання. Ваш коментар зайвий.
Mitch Wheat

2
@ IEBasara: Це неявно. Чому ви очікуєте, що не адміністратор зможе переглядати таку інформацію?
Mitch Wheat

1
Пізно на вечірку .. але .. sysadminнеобхідна роль (редагувати коментар) врятувала мій батокс. Я постійно отримував 1, припускаючи, що у мене були правильні хімічні завивки. Фу! закріплені та совольовані. win : money_with_wings:
Pure.Krome

7

Як згадував @jwalkerjr, вам слід утилізувати з'єднання в коді (якщо пул з'єднань увімкнено, вони просто повертаються до пулу з'єднань). Для цього передбачено використання 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);
            }
        }
    }
}

Автор запитував, що вони використовують PHP, тому зразок коду може бути для них невідповідним. Збирач сміття повинен автоматично очищати непостійні підключення SQL Server, коли на них більше немає посилань (і всі посилання будуть скинуті в кінці циклу сторінки), але, можливо, автор запиту використовує постійні з'єднання, що вимагає інтелектуального з'єднання повторне використання.
Paul d'Aoust

5

Використовуйте це, щоб отримати точний підрахунок для кожного пулу з'єднань (припускаючи, що кожен процес користувач / хост використовує один і той же рядок з'єднання)

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

Я знаю, що це старе, але вважав, що було б непогано оновити. Якщо потрібен точний підрахунок, то, можливо, слід відфільтрувати і ECID стовпця. SPID з паралельними потоками може відображатися кілька разів у системних процесах, і фільтрація ECID = 0 поверне основний потік для кожного 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

1

Якщо у вашому додатку PHP відкрито багато з'єднань SQL Server, то, як ви вже знаєте, у вас проблема з кодом бази даних вашого додатка. Це має бути звільнення / утилізація цих з'єднань після використання та використання пулу з'єднань. Подивіться тут гідну статтю на цю тему ...

http://www.c-sharpcorner.com/UploadFile/dsdaf/ConnPooling07262006093645AM/ConnPooling.aspx


0

дивіться sp_who, це дає вам більше деталей, ніж просто перегляд кількості з'єднань

у вашому випадку я б зробив щось подібне

 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 - Як дізнатися про відкриті підключення (-і) бази даних SQL та зайняті на якому хості.

Використовуючи запит нижче, ви знайдете базу даних списку, ім’я хосту та загальну кількість відкритих підключень, виходячи з того, що ви будете мати уявлення, який хост зайняв з’єднання 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.