Мониторинг выполнения SQL-запроса в SQL SERVER

Я видел аналогичный вопрос, в котором спрашивалось, как отслеживать прогресс операции резервного копирования / восстановления: Есть ли сценарий SQL, который я могу использовать для определения хода процесса резервного копирования или восстановления SQL Server?

Я хотел бы знать, есть ли аналогичный запрос / способ узнать, сколько времени осталось у запроса до его завершения. Например, один запрос обычно имеет истекшее время 5 минут. Я хотел бы знать, сколько времени осталось до его завершения ВО ВРЕМЯ выполнения запроса.


person Roni Vered    schedule 20.07.2010    source источник
comment
Привет, Рони, уточнить, хотите ли вы отслеживать ход выполнения запроса, выполняющего резервное копирование / восстановление? Или запрос вообще?   -  person Alex KeySmith    schedule 03.01.2013


Ответы (4)


Невозможно узнать, сколько времени осталось. Время выполнения запроса зависит от многих вещей, помимо самого запроса: блокировки / блокировки других запросов, других процессов, потребляющих ресурсы (использование ЦП / диска), операционной системы, сети и т. Д. Что делать, если ваш 5-минутный запрос еще выполняется кто-то другой запускает большой отчет, ваш запрос может выполняться сейчас 5:30. Что, если кто-то начнет скачивать большой файл и потребляет всю пропускную способность сети? Что, если ОС решит сделать что-то в фоновом режиме и т. Д. Пока не будут возвращены все строки, запрос не будет выполнен, но он может выполняться в переменном временном интервале.

person KM.    schedule 20.07.2010
comment
Верно. В некоторых (плохо настроенных / перегруженных) системах один интенсивный запрос может заблокировать важную таблицу - и внезапно запросы, которые обычно завершаются при втором запуске в течение десятков минут. Вы можете посмотреть время запроса и сделать предположение - в среднем этот запрос завершается за 5:41, он выполняется уже 3:15, но это всего лишь предположение (даже не оценка). - person Piskvor left the building; 20.07.2010
comment
Я видел хранители экрана для 3D-рендеринга, работающие на ящиках с производственной базой данных! - person KM.; 20.07.2010
comment
В Oracle, например, у нас есть представление v $ session_longops, которое отображает статус операций. download.oracle.com/docs/cd/B19306_01/ server.102 / b14237 / Я уверен, что в SQL SERVER ничего подобного нет? Рони. - person Roni Vered; 20.07.2010
comment
@Roni Vered, существует множество способов получить информацию от SQL Server о запущенных запросах, но не использовать значение TIME_RAMINING. Вы можете рассчитать среднее значение на основе предыдущих запусков, см. stackoverflow.com/questions/617170/ - person KM.; 20.07.2010
comment
Единственные люди, которые еще не ожидают, что оценки времени будут колебаться в зависимости от нагрузки на сервер, действительно очень плохо знакомы с компьютерами. Принимая, что оценка времени является приблизительной, попробуйте SELECT percent_complete FROM sys.dm_exec_requests, которую затем можно использовать для оценки того, сколько времени должно осталось для выполнения запроса. - person WonderWorker; 30.08.2018

Вам нужна статистика запросов в реальном времени.

Вы можете активировать его в самой последней версии SSMS, нажав кнопку рядом с той, которая дает вам обычный план запроса:

введите описание изображения здесь

Это дает вам план запроса в реальном времени:

введите описание изображения здесь

Внизу вы видите общий прогресс:

введите описание изображения здесь

person John    schedule 16.03.2017
comment
Я чувствую, что это может как-то негативно повлиять на производительность запроса. Я имею в виду - почему иначе было бы невозможно получить информацию о ходе выполнения без включения планов запросов в реальном времени? РЕДАКТИРОВАТЬ: Оказывается, есть большая жирная предупреждающая этикетка на документация по текущей статистике запросов. Действительно, это отрицательно сказывается на производительности. Используйте с осторожностью! - person Dan; 22.11.2018

У sys.dm_exec_requests есть эта информация, так что что-то вроде этого покажет вам прогресс:

SELECT 
percent_complete
FROM sys.dm_exec_requests
--where session_id=51 or command like 'restore%'
person Andrey.ca    schedule 14.12.2011
comment
Этот запрос полезен, только если у вас есть разрешение ПРОСМОТР СОСТОЯНИЯ СЕРВЕРА. Если вы этого не сделаете, вы увидите только результаты только что отправленного оператора SELECT, что немного бесполезно! Чтобы установить, есть ли у вас разрешения, выполните следующую команду SELECT * FROM fn_my_permissions (NULL, 'SERVER'); - Если вы не видите запись с именем permission_name «ПРОСМОТР СОСТОЯНИЯ СЕРВЕРА», значит, у вас нет разрешения. - person samaspin; 13.03.2013
comment
Кроме того, эта информация предоставляется только при выполнении определенных команд. Это, например, ROLLBACK, RECOVERY или BACKUP DATABASE. - person user35443; 09.11.2013

Да, вы можете узнать примерное прошедшее время, если только не возникнет непредвиденная ситуация, влияющая на выполнение процесса.

Select total_elapsed_time,
 * from sys.dm_exec_sessions where session_id="your Id here" 
person JameSQL    schedule 30.09.2015