Существует как минимум три простых способа определения времени последнего перезапуска службы 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. Не забудьте исключить деление на ноль, используя показанный ниже синтаксис.
Экран 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);