Существует как минимум три простых способа определения времени последнего перезапуска службы SQL Server на экземпляре SQL Server. Выбор между двумя динамическими административными представлениями Dynamic Management View и системным каталогом System Catalog View я оставляю за читателем. Для чего нужна эта информация? Многие диагностические запросы требуют знания временных рамок, в которых были определены метрики производительности. Некоторые метаданные о производительности системы, а именно динамические объекты управления Dynamic Management Objects, по завершении работы службы удаляются. Анализируя использование индекса для оценки его применения в запросах поиска или сканирования, необходимо знать, принимается ли решение о целесообразности выгрузки данных о «неиспользуемом» индексе (по результатам запроса sys.dm_db_index_usage_stats) на основании статистически значимого диапазона данных. Если показатели применения индекса определены лишь за несколько дней или недель, то заключение о степени его использования может оказаться некорректным, поскольку многие запросы могут относиться к задачам, не попадающим в интервал выборки.

С учетом сказанного рассмотрим три способа получения этой информации.

Первый способ: sys.databases

Системное представление каталога sys.databases в SQL Server 2005 и более новой версии позволяет получить метаданные о каждой базе данных в рамках конкретного экземпляра SQL Server. Поскольку база данных tempdb создается заново всякий раз при перезапуске служб, по времени ее создания можно определить время последнего запуска служб.

SELECT create_date
FROM sys.databases
WHERE name = 'tempdb';

Второй способ: sys.dm_exec_sessions

Это динамическое представление содержит информацию о сеансах на данном экземпляре SQL Server. Так как первый сеанс инициируется при запуске службы SQL Server, в качестве времени последнего запуска службы SQL Server можно использовать значение, указанное в столбце login_time (время регистрации).

SELECT login_time
FROM sys.dm_exec_sessions
WHERE session_id = 1;

Третий способ: sys.dm_os_sys_info(SQL Server 2014)

Начиная с SQL Server 2005 схема этого динамического представления претерпевает изменения с каждым основным выпуском (а также с выходом накопительных обновлений (CU) и пакетов обновлений (SP)). Однако начиная с SQL Server 2014 это представление включает столбец sqlserver_start_time, несущий информацию о времени последнего запуска службы.

SELECT sqlserver_start_time
FROM sys.dm_os_sys_info;

Если сопоставить результаты этих трех запросов, то можно заметить, что данные различаются (см. экран 1). Это легко объяснить, если проанализировать источники данных.

 

Сравнение результатов трех запросов
Экран 1. Сравнение результатов трех запросов

Последний результат указывает на самое раннее время и старше второго результата почти на две секунды. Это время запуска служб, взятое из столбца sql_server_start_time в результате запроса sys.dm_os_sys_info и соответствующее истинному времени запуска службы SQL Server.

Второй результат указывает на время, наступившее почти на две секунды позже запуска служб и соответствующее началу первого сеанса. Это указывает на наличие примерно двухсекундного интервала между запуском служб и первым сеансом установления соединения.

Первый результат несет информацию о моменте, наступившем спустя еще примерно две секунды после запуска первого сеанса. Это время создания базы данных tempdb.

Хотя результаты несколько различаются, а администраторы баз данных отличаются скрупулезностью, едва ли вам понадобится миллисекундная точность в определении времени запуска служб SQL Server, поэтому я бы назвал достоверным любой из этих источников информации. Полученную дату запуска я обычно использую в формуле DATEDIFF (), как показано на экране 2, чтобы указать число дней, в течение которых служба SQL Server работала. Это число дней можно использовать в качестве знаменателя для усреднения метрик, таких как число сканирований индекса за день (результат выполнения упомянутого выше запроса sys.dm_db_index_usage_stats) или загрузка ввода-вывода за день по выходным данным запроса sys.dm_io_virtual_file_stats. Не забудьте исключить деление на ноль, используя показанный ниже синтаксис.

 

Определение числа дней работы службы SQL Server
Экран 2. Определение числа дней работы службы SQL Server
DECLARE @days AS smallint;

SELECT @days =
CASE
   WHEN DATEDIFF(DAY,
   sqlserver_start_time, getdate()) =
   0 THEN 1
   ELSE DATEDIFF(DAY,
   sqlserver_start_time, getdate())
END
FROM sys.dm_os_sys_info;

SELECT num_of_reads,
   num_of_writes,
   num_of_reads/@days AS reads_daily,
   num_of_writes/@days as writes_daily
FROM sys.dm_io_virtual_file_stats
   (DB_ID('iDBA'),1);