Анализ сессий пользователей базы данных Microsoft SQL (далее БД) можно произвести с помощью данных из системной таблицы sys.dm_exec_sessions. Этот анализ может показать «узкие места» архитектуры БД и бизнес-процессов, связанных с ней. Далее будут рассмотрены следующие показатели:
- ID источника подключения
 - Источник подключения
 - Количество активных сессий
 - Cреднее время использования CPU (сек.)
 - Среднее общее время выполненния операций (сек.)
 - Среднее запланированное время выполнения операций (сек.)
 - Среднее использование памяти
 - Среднее количество операций чтения
 - Среднее количество операций записи
 - Доля использования CPU
 - Операции >6 сек
 - Операции >5 мин
 - Время простоя (сек.)
 
Описание показателей¶
| Показатель | Описание | Диапазоны значений | 
|---|---|---|
| ID источника подключения и Источник подключения | В основе поле host_name — идентификатор источника подключения и его добное для восприятия наименование.Системный анализ: — Идентификация источников подключения к БД — Распределение сессий по типам клиентов (приложения, пользователи, системные процессы) — Выявление неавторизованных или неизвестных подключений Бизнес-анализ: — Определение наиболее активных бизнес-единиц/пользователей — Распределение нагрузки по отделам/приложениям — Контроль доступа и соответствие политикам безопасности Анализ данных: — Ключ для сегментации и группировки метрик — Выявление аномальных паттернов подключений  | 
✅ Нормальные: Известные host_name из белого списка ⚠️ Аномальные: Неизвестные имена, несоответствие naming convention 🔴 Критические: NULL значения, подозрительные имена (например, из внешних сетей)  | 
| Количество активных сессий | Количество активынх сессий для каждого хоста. Подсчитано с помощью команды COUNT(*).Системный анализ: — Нагрузка на лицензирование (каждое соединение потребляет ресурсы) — Эффективность использования пулов соединений — Выявление «распыленных» подключений Бизнес-анализ: — Активность пользователей/приложений — Соответствие лицензионным ограничениям — Эффективность использования ресурсов Анализ данных: — Базовый показатель для нормализации других метрик — Выявление аномалий в количестве подключений  | 
✅ Нормальные: — Пользователи: 1-5 сессий — Серверы приложений: 10-200 (зависит от нагрузки) — Системные: 5-50 ⚠️ Аномальные: — Пользователи: 6-15 сессий — Серверы приложений: 201-500 🔴 Критические: — Пользователи: >15 сессий — Серверы приложений: >500 — Внезапные скачки >100%  | 
| Cреднее время использования CPU (сек.) | Среднее время использования процессора в секунду на сессию. Расчитано с помощью формулы AVG((cpu_time * 1.) / 1000), где cpu_time — CPU-время (в миллисекундах), использованное сессией.Системный анализ — Нагрузка на процессор от разных источников — Эффективность выполнения запросов — Выявление «тяжелых» вычислений Бизнес-анализ: — Стоимость вычислительных ресурсов по пользователям/приложениям — Влияние на общую производительность системы — Обоснование для апгрейда оборудования Анализ данных: — Индикатор сложности выполняемых операций — Базис для расчета ROI оптимизаций  | 
✅ Нормальные: 0.001 — 0.1 секунды (OLTP системы) ⚠️ Аномальные: 0.1 — 1.0 секунда 🔴 Критические: >1.0 секунды (особенно >5 секунд)  | 
| Среднее общее время выполненния операций (сек.) | Расчитывается с помощью формулы AVG((total_elapsed_time * 1.) / 1000), где total_elapsed_time — это общее время выполнения сессии в миллисекундах. Включает ВСЁ время с момента установки соединения: активное выполнение + время ожидания. Пример: если соединение установлено 5 минут назад, но активно работало только 30 секунд, значение будет ~300000 мс. Формула:  total_elapsed_time = CPU_time + Wait_timeСистемный анализ — Общее время выполнения операций (CPU + ожидание) — Выявление bottlenecks (ожидание диска, блокировки, сеть) — Эффективность планировщика запросов Бизнес-анализ: — Время отклика системы для пользователей — Влияние на бизнес-процессы — Обоснование для оптимизации Анализ данных: — Интегральный показатель производительности — Корреляция с другими метриками для выявления причин  | 
✅ Нормальные: 0.01 — 0.5 секунд ⚠️ Аномальные: 0.5 — 5.0 секунд 🔴 Критические: >5.0 секунд  | 
| Среднее запланированное время выполнения операций (сек.) | Среднее время, которое сессии заплонировали на выполнение операций). Расчитывается по формуле AVG((total_scheduled_time * 1.) / 1000), где total_scheduled_time — время, выделенное планировщиком для выполнения сессии (в миллисекундах). Показывает, сколько времени сессия была в состоянии RUNNABLE или RUNNING. Это время, когда сессия могла использовать CPU (даже если фактически не использовала). Обычно total_scheduled_time ≤ total_elapsed_time.Системный анализ — Время, которое запросы находились в состоянии выполнения — Эффективность работы планировщика — Соотношение времени выполнения к общему времени Бизнес-анализ: Индикатор «полезной» работы системы — Эффективность использования вычислительных ресурсов Анализ данных: — Отношение к total_elapsed_time показывает уровень параллелизма  | 
✅ Нормальные: Меньше или равно total_elapsed_time 🔴 Критические: Значительно превышает total_elapsed_time  | 
| Среднее использование памяти | Среднее использование памяти в 8-КБ страницах. Рассчитывается по формуле AVG(memory_usage * 1.).Системный анализ — Потребление памяти процессами — Выявление утечек памяти — Эффективность кэширования Бизнес-анализ: — Стоимость оперативной памяти — Влияние на масштабируемость Анализ данных: — Тренды использования памяти — Корреляция с другими метриками производительности  | 
✅ Нормальные: 0-100 страниц на сессию ⚠️ Аномальные: 100-1000 страниц 🔴 Критические: >1000 страниц  | 
| Среднее количество операций чтения и Среднее количество операций записи | Рассчитываются по формулам AVG(reads * 1.) и AVG(writes * 1.), где reads — общее количество логических чтений за всю сессию, а writes — общее количество логических записей за всю сессию. Измеряются в страницах (по 8 КБ каждая). reads включает чтения из buffer pool (кэша). Высокие значения могут указывать на неоптимальные запросы (отсутствие индексов), большие объемы обрабатываемых данных или повторяющиеся сканирования таблиц. writes отображает операции INSERT, UPDATE, DELETE. Важно: это логические записи, физические могут быть отложены (checkpoint, lazy writer).Системный анализ — Нагрузка на подсистему ввода-вывода — Эффективность индексов и кэширования — Выявление «тяжелых» запросов Бизнес-анализ: — Требования к производительности хранилища — Стоимость IO операций — Влияние на время отклика Анализ данных: — Паттерны доступа к данным — Эффективность архитектуры БД  | 
✅ Нормальные reads: 0-1000 ⚠️ Аномальные reads: 1000-10000 🔴 Критические reads: >10000 ✅ Нормальные writes: 0-100 ⚠️ Аномальные writes: 100-1000 🔴 Критические writes: >1000  | 
| Доля использования CPU | Доля или эффективность использования CPU — это отношение времени CPU к общему времени сессии. Это доля времени, которое сессия реально использовала CPU. Рассчитывается по формуле AVG(cpu_time * 1.) / AVG(total_elapsed_time * 1.). Высокое соотношение (близкое к 1) указывает на высокую нагрузку на процессор. Низкое соотношение может означать, что сессия много ждет (например, завершения I/O или снятия блокировок).Системный анализ — Эффективность использования процессорного времени — Выявление проблем с ожиданием (блокировки, дисковый IO) — Баланс между вычислениями и ожиданием Бизнес-анализ: — ROI процессорных мощностей — Приоритеты для оптимизации Анализ данных: — Ключевой показатель эффективности системы  | 
✅ Нормальные: 0.1 — 0.8 (10-80%) ⚠️ Аномальные: <0.1 или >0.8 🔴 Критические: 0 (только ожидание) или 1 (только вычисления)  | 
| Количество операций >6 сек и Количество операций >5 мин. | Количество сессий с длительными CPU операциями. Рассчитываются по формулам COUNT((CASE WHEN cpu_time > 60000 THEN cpu_time END * 1.)/1000) и COUNT((CASE WHEN cpu_time > 300000 THEN cpu_time END * 1.)/1000), соответственно. Несколько одновременных сессий с cpu_time > 60000 (1 минута) требуют внимания. cpu_time > 300000 (5 минут) для одной сессии являются критическими.Системный анализ — Количество проблемных запросов — Приоритеты для оптимизации — Мониторинг SLA Бизнес-анализ: — Количество нарушений соглашений об уровне service — Влияние на бизнес-процессы Анализ данных: — Частота возникновения проблем — Тренды ухудшения/улучшения  | 
✅ Нормальные: 0 ⚠️ Аномальные: 1-5 минут 🔴 Критические: >5 минут  | 
| Время простоя (сек.) | Скролько времени спящие сессии находятся в бездействии. Рассчитывается по формуле AVG(CASE WHEN status = 'sleeping' THEN DATEDIFF(SECOND, last_request_end_time, GETDATE()) END), где status — состояние и статус сессии, которые могут быть Running, Sleeping, Dormant или Preconnect, а также last_request_end_time — время завершения последнего запроса в сессии. last_request_end_time обновляется после успешного завершения запроса и, если запрос выполняется прямо сейчас, то показывает время завершения предыдущего запроса. Если status = sleeping, а разница между текущим временем и last_request_end_time велика (например, больше часа), это может указывать на «потерянное» соединение, которое не было корректно закрыто приложением и зря занимает ресурсы.Системный анализ — Эффективность управления соединениями — Выявление утечек соединений — Нагрузка на сервер от «висящих» сессий Бизнес-анализ: — Эффективность разработки приложений — Соответствие best practices — Риски для стабильности системы Анализ данных: — Индикатор качества кода приложений — Тренды в управлении ресурсами  | 
✅ Нормальные: 0-300 секунд (5 минут) ⚠️ Аномальные: 300-3600 секунд (1 час) 🔴 Критические: >3600 секунд (1 час)  | 
Пример скрипта и результаты его выполнения¶
Пример скрипта:
SELECT  host_name AS [ID источника подключения],
        CASE
            WHEN host_name = 'DC1-AS001' THEN 'Сервер приложений 1'
            WHEN host_name = 'DC1-AS002' THEN 'Сервер приложений 2'
            WHEN host_name = 'DC2-AS003' THEN 'Сервер приложений 3'
            WHEN host_name = 'DC1-SQL' THEN 'Сервер БД'
            WHEN host_name = 'MOS-WJR2' THEN 'Иванов И.И.'
            WHEN host_name = 'SPB-OS25' THEN 'Петров П.С.'
        END AS [Источник подключения],
        COUNT(*) AS [Количество активных сессий],
        AVG((cpu_time * 1.) / 1000) AS [Cреднее время использования CPU (сек.)],
        AVG((total_elapsed_time * 1.) / 1000) AS [Среднее общее время выполненния операций (сек.)],
        AVG((total_scheduled_time * 1.) / 1000) AS [Среднее запланированное время выполнения операций (сек.)],
        AVG(memory_usage * 1.) AS [Среднее использование памяти],
        AVG(reads * 1.) AS [Среднее количество операций чтения],
        AVG(writes * 1.) AS [Среднее количество операций записи],
        CASE
            WHEN AVG(cpu_time * 1.) > 0 AND AVG(total_elapsed_time * 1.) > 0 THEN AVG(cpu_time * 1.) / AVG(total_elapsed_time * 1.)
            ELSE 0
        END AS [Доля использования CPU],
        COUNT((CASE WHEN cpu_time > 60000 THEN cpu_time END * 1.)/1000) AS [Операции >6 сек],
        COUNT((CASE WHEN cpu_time > 300000 THEN cpu_time END * 1.)/1000) AS [Операции >5 мин],
        AVG(CASE WHEN status = 'sleeping' THEN DATEDIFF(SECOND, last_request_end_time, GETDATE()) END) AS [Время простоя (сек.)],
FROM sys.dm_exec_sessions
GROUP BY host_name
ORDER BY [Пользователи БД];
Пример результата выполнения скрипта:
| ID источника подключения | Источник подключения | Количество активных сессий | Cреднее время использования CPU (сек.) | Среднее общее время выполненния операций (сек.) | Среднее запланированное время выполнения операций (сек.) | Среднее использование памяти | Среднее количество операций чтения | Среднее количество операций записи | Доля использования CPU | Операции >6 сек | Операции >5 мин | Время простоя (сек.) | 
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| NULL | NULL | 88 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0 | 0 | NULL | 
| MOS-WJR2 | Иванов И.И. | 6 | 6.409166 | 15.154500 | 7.60633 | 4.000000 | 339852.000000 | 4.333333 | 0.422921 | 0 | 0 | 162735 | 
| SPB-OS25 | Петров П.С. | 30 | 15.925833 | 39.343933 | 28.869500 | 4.066666 | 554270.600000 | 96.233333 | 0.404784 | 1 | 1 | 863687 | 
| DC1-SQL | Сервер БД | 6 | 1.422833 | 9.225500 | 3.149000 | 3.333333 | 68.833333 | 8121.333333 | 0.154228 | 0 | 0 | 1250104 | 
| DC1-AS001 | Сервер приложений 1 | 103 | 0.015436 | 0.131563 | 0.015077 | 6.669902 | 0.611650 | 1.009708 | 0.117334 | 0 | 0 | 61 | 
| DC1-AS002 | Сервер приложений 2 | 84 | 0.040380 | 0.146333 | 0.044011 | 6.000000 | 1.500000 | 2.511904 | 0.275951 | 0 | 0 | 62 | 
| DC1-AS003 | Сервер приложений 3 | 102 | 0.010558 | 0.164392 | 0.012333 | 6.725490 | 0.980392 | 0.872549 | 0.064229 | 0 | 0 | 49 | 
🔍 Пример детального анализа данных из примера по группам¶
1. Неизвестные подключения (NULL)¶
| Показатель | Значение | Оценка | Обоснование | 
|---|---|---|---|
| Количество активных сессий | 88 | ⚠️ Аномально | Неидентифицируемые подключения | 
| Cреднее время использования CPU (сек.) | 0.000000 | ✅ Нормально | Системные процессы | 
| Среднее общее время выполненния операций (сек.) | 0.000000 | ✅ Нормально | Системные процессы | 
| Среднее количество операций чтения | 0.000000 | ✅ Нормально | Системные процессы | 
| Среднее количество операций записи | 0.000000 | ✅ Нормально | Системные процессы | 
| Доля использования CPU | 0.000000 | ✅ Нормально | Системные процессы | 
| Время простоя (сек.) | NULL | ⚠️ Аномально | Неизвестное состояние | 
Вывод:¶
- Системный анализ: Системные/фоновые процессы, не имеющие host_name
 - Бизнес-анализ: Неидентифицируемые подключения — требуется выяснить их природу
 - Анализ данных: Требуют дополнительного исследования через program_name и login_name
 
2. Иванов И.И. (6 сессий)¶
| Показатель | Значение | Оценка | Обоснование | 
|---|---|---|---|
| Количество активных сессий | 6 | ⚠️ Аномально | Для пользователя >5 сессий | 
| Cреднее время использования CPU (сек.) | 6.409166 сек | 🔴 Критически | 1.0 сек | 
| Среднее общее время выполненния операций (сек.) | 15.154500 сек | 🔴 Критически | 5.0 сек | 
| Среднее количество операций чтения | 339852.000000 | 🔴 Критически | 10,000 | 
| Среднее количество операций записи | 4.333333 | ✅ Нормально | <100 | 
| Доля использования CPU | 0.422921 (42.3%) | ✅ Нормально | 10-80% | 
| Операции >6 сек | 0 | ✅ Нормально | 0 | 
| Операции >5 мин | 0 | ✅ Нормально | 0 | 
| Время простоя (сек.) | 162735 сек | 🔴 Критически | 3,600 сек | 
Вывод:¶
- Основная проблема: Экстремально высокие операции чтения и время простоя
 - Вторичная проблема: Избыточное количество сессий
 - CPU используется эффективно (42.3%), но операции слишком тяжелые
 
3. Петров П.С. (30 сессий)¶
| Показатель | Значение | Оценка | Обоснование | 
|---|---|---|---|
| Количество активных сессий | 30 | 🔴 Критически | Для пользователя >15 сессий | 
| Cреднее время использования CPU (сек.) | 15.925833 сек | 🔴 Критически | 1.0 сек | 
| Среднее общее время выполненния операций (сек.) | 39.343933 сек | 🔴 Критически | 5.0 сек | 
| Среднее количество операций чтения | 554270.600000 | 🔴 Критически | 10,000 | 
| Среднее количество операций записи | 96.233333 | ✅ Нормально | <100 | 
| Доля использования CPU | 0.404784 (40.5%) | ✅ Нормально | 10-80% | 
| Операции >6 сек | 1 | ⚠️ Аномально | 0 | 
| Операции >5 мин | 1 | 🔴 Критически | 0 | 
| Время простоя (сек.) | 863687 сек | 🔴 Катастрофически | 3,600 сек | 
Вывод:¶
- Катастрофическая ситуация по всем метрикам
 - Наибольшая нагрузка на систему среди всех пользователей
 - Имеются сверхдлительные операции (>5 минут CPU времени)
 - Эффективность CPU нормальная, но объем работы экстремальный
 
4. Сервер БД (6 сессий)¶
| Показатель | Значение | Оценка | Обоснование | 
|---|---|---|---|
| Количество активных сессий | 6 | ✅ Нормально | Системные процессы | 
| Cреднее время использования CPU (сек.) | 1.422833 сек | 🔴 Критически | 1.0 сек | 
| Среднее общее время выполненния операций (сек.) | 9.225500 сек | 🔴 Критически | 5.0 сек | 
| Среднее количество операций чтения | 68.833333 | ✅ Нормально | <1000 | 
| Среднее количество операций записи | 8121.333333 | 🔴 Критически | 1,000 | 
| Доля использования CPU | 0.154228 (15.4%) | ⚠️ Аномально | <20% | 
| Операции >6 сек | 0 | ✅ Нормально | 0 | 
| Операции >5 мин | 0 | ✅ Нормально | 0 | 
| Время простоя (сек.) | 1250104 сек | 🔴 Катастрофически | 3,600 сек | 
Вывод:¶
- Низкая эффективность CPU — всего 15.4% (много времени в ожидании)
 - Высокая нагрузка записи — возможны фоновые процессы обслуживания
 - Катастрофическое время простоя — сессии не закрываются 14.5 дней!
 
5. Серверы приложений¶
DC1-AS001 (103 сессии)¶
| Показатель | Значение | Оценка | Обоснование | 
|---|---|---|---|
| Количество активных сессий | 103 | ✅ Нормально | Для сервера приложений | 
| Cреднее время использования CPU (сек.) | 0.015436 сек | ✅ Нормально | <0.1 сек | 
| Среднее общее время выполненния операций (сек.) | 0.131563 сек | ✅ Нормально | <0.5 сек | 
| Среднее количество операций чтения | 0.611650 | ✅ Нормально | <1000 | 
| Среднее количество операций записи | 1.009708 | ✅ Нормально | <100 | 
| Доля использования CPU | 0.117334 (11.7%) | ⚠️ Низковато | <20% | 
| Операции >6 сек | 0 | ✅ Нормально | 0 | 
| Операции >5 мин | 0 | ✅ Нормально | 0 | 
| Время простоя (сек.) | 61 сек | ✅ Нормально | <300 сек | 
DC1-AS002 (84 сессии)¶
| Показатель | Значение | Оценка | Обоснование | 
|---|---|---|---|
| Количество активных сессий | 84 | ✅ Нормально | Для сервера приложений | 
| Cреднее время использования CPU (сек.) | 0.040380 сек | ✅ Нормально | <0.1 сек | 
| Общее время | 0.146333 сек | ✅ Нормально | <0.5 сек | 
| Среднее количество операций чтения | 1.500000 | ✅ Нормально | <1000 | 
| Среднее количество операций записи | 2.511904 | ✅ Нормально | <100 | 
| Доля использования CPU | 0.275951 (27.6%) | ✅ Нормально | 10-80% | 
| Операции >6 сек | 0 | ✅ Нормально | 0 | 
| Операции >5 мин | 0 | ✅ Нормально | 0 | 
| Время простоя (сек.) | 62 сек | ✅ Нормально | <300 сек | 
DC1-AS003 (102 сессии)¶
| Показатель | Значение | Оценка | Обоснование | 
|---|---|---|---|
| Количество активных сессий | 102 | ✅ Нормально | Для сервера приложений | 
| Cреднее время использования CPU (сек.) | 0.010558 сек | ✅ Нормально | <0.1 сек | 
| Среднее общее время выполненния операций (сек.) | 0.164392 сек | ✅ Нормально | <0.5 сек | 
| Среднее количество операций чтения | 0.980392 | ✅ Нормально | <1000 | 
| Среднее количество операций записи | 0.872549 | ✅ Нормально | <100 | 
| Доля использования CPU | 0.064229 (6.4%) | ⚠️ Низковато | <20% | 
| Операции >6 сек | 0 | ✅ Нормально | 0 | 
| Операции >5 мин | 0 | ✅ Нормально | 0 | 
| Время простоя (сек.) | 49 сек | ✅ Нормально | <300 сек | 
Вывод по серверам приложений:¶
- Работают стабильно и эффективно
 - Низкая доля CPU указывает на быстрые запросы с минимальными вычислениями
 - Отличное управление соединениями — простоя почти нет
 
📋 Сводный анализ проблем по приоритетам¶
🔴 КРИТИЧЕСКИЕ ПРОБЛЕМЫ (Требуют немедленного вмешательства)¶
- Катастрофические утечки соединений:
- Сервер БД: 1,250,104 сек (14.5 дней)
 - Петров П.С.: 863,687 сек (10 дней)
 - Иванов И.И.: 162,735 сек (1.9 дня)
 
 - Экстремальные операции чтения:
- Петров П.С.: 554,270 операций/сессию
 - Иванов И.И.: 339,852 операций/сессию
 
 - Сверхдлительные операции CPU:
- Петров П.С.: операции >5 минут CPU времени
 
 
⚠️ СЕРЬЕЗНЫЕ ПРОБЛЕМЫ (Требуют срочной оптимизации)¶
- Высокое время выполнения запросов:
- Петров П.С.: 39.34 сек в среднем
 - Иванов И.И.: 15.15 сек в среднем
 
 - Избыточное количество сессий:
- Петров П.С.: 30 сессий (норма: 1-5)
 
 - Низкая эффективность сервера БД:
- Доля CPU всего 15.4% — много времени в ожидании
 
 
🛠️ Рекомендации по действиям¶
НЕМЕДЛЕННЫЕ ДЕЙСТВИЯ:
-- Закрыть висящие соединения
SELECT
    session_id,
    login_name,
    host_name,
    DATEDIFF(HOUR, last_request_end_time, GETDATE()) as idle_hours
FROM sys.dm_exec_sessions
WHERE status = 'sleeping'
AND DATEDIFF(HOUR, last_request_end_time, GETDATE()) > 1
ORDER BY idle_hours DESC;
-- KILL session_id для соединений старше 24 часов
ОПТИМИЗАЦИЯ:¶
- Анализ запросов Петрова П.С. — найти и оптимизировать операции с 554K reads
 - Настройка пула соединений для пользовательских приложений
 - Внедрение мониторинга длительных операций в реальном времени
 - Оптимизация индексов для снижения операций чтения
 
ПРОФИЛАКТИКА:¶
- Установка лимитов на время выполнения запросов
 - Настройка автоматического закрытия неактивных соединений
 - Обучение пользователей правильной работе с БД
 
📝 Заключение¶
Система находится в критическом состоянии из-за проблем управления соединениями и неоптимизированных запросов. Требуются срочные меры для предотвращения коллапса.
