Как определить общее количество открытых / активных подключений в ms sql server 2005

90

Мое приложение PHP / MS Sql Server 2005 / win 2003 иногда перестает отвечать на запросы, использование памяти / процессора не увеличивается. Если я попытаюсь открыть любое новое соединение из студии управления sql, оно просто зависнет в диалоговом окне открытого соединения. как определить общее количество активных подключений ms sql server 2005

Энди Лестер
источник

Ответы:

269

Это показывает количество подключений для каждой БД:

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. Если вы вошли в систему как пользователь, не являющийся пользователем sa, вы увидите 1, и это не будет соответствовать фактическим соединениям.
ajeh
3
@ajeh: подразумевается, что у вас достаточно прав для выполнения задачи. Ваш комментарий лишний.
Митч Уит,
2
@ IEBasara: это неявно. Почему вы ожидаете, что такую ​​информацию сможет просматривать не администратор?
Митч Уит
1
Поздно на вечеринку .. но .. sysadminтребуемая роль (редактировать комментарий) спасла мою задницу. Я продолжал получать 1 при условии, что у меня была правильная химическая завивка. Уф! фиксированный и совмещенный. победа : 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, когда на них больше нет ссылок (и все ссылки будут удалены в конце цикла страницы), но, возможно, запрашивающий использует постоянные соединения, что требует интеллектуального соединения. повторное использование.
Поль д'Ост
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
realstrategos
источник
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
sqldba.today
источник
1

Если в вашем приложении PHP открыто много подключений к SQL Server, то, как вы, возможно, знаете, у вас проблема с кодом базы данных вашего приложения. Он должен освобождать / удалять эти соединения после использования и использовать пул соединений. Поищите здесь достойную статью по этой теме ...

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

Jwalkerjr
источник
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
FatemehEbrahimiNik
источник