В SQL Server есть возможность получить примерное время завершения долгоиграющих команд, что сбережён нервы администратору БД. К сожалению, не для всех команд есть такая возможность. Вот список команд, с которыми работает данный метод:
- ALTER INDEX REORGANIZE
- AUTO_SHRINK с ALTER DATABASE
- BACKUP DATABASE
- CREATE INDEX
- DBCC CHECKDB
- DBCC CHECKFILEGROUP
- DBCC CHECKTABLE
- DBCC INDEXDEFRAG
- DBCC SHRINKDATABASE
- DBCC SHRINKFILE
- KILL (Transact-SQL)
- RESTORE DATABASE
- UPDATE STATISTICS
Скрипт, для получения всего списка выглядит следующим образом:
-- Процент исполнения длительного запроса ввода-вывода
SELECT ost.session_id
, DB_NAME(ISNULL(s.dbid,1)) AS dbname
, er.command
, er.percent_complete
, dateadd (ms, er.estimated_completion_time, getdate()) AS [Прогноз завершения]
, er.status
, osth.os_thread_id
, ost.pending_io_count
, ost.scheduler_id
, osth.creation_time
, ec.last_read
, ec.last_write
, s.text
, owt.exec_context_id
, owt.wait_duration_ms
, owt.wait_type
FROM master.sys.dm_os_tasks AS ost
JOIN master.sys.dm_os_threads AS osth ON ost.worker_address = osth.worker_address
AND ost.pending_io_count > 0 AND ost.session_id IS NOT NULL
JOIN master.sys.dm_exec_connections AS ec ON ost.session_id = ec.session_id
CROSS APPLY master.sys.dm_exec_sql_text(ec.most_recent_sql_handle) AS s
JOIN master.sys.dm_os_waiting_tasks AS owt ON ost.session_id = owt.session_id
AND owt.wait_duration_ms > 0
JOIN master.sys.dm_exec_requests AS er ON ost.session_id = er.session_id
AND er.percent_complete > 0
ORDER BY ost.session_id
GO
Так же можно получить информацию только для конкретного id сессии (в текущем примере используется id сессии = 99):
-- Процент исполнения длительного запроса ввода-вывода
SELECT ost.session_id
, DB_NAME(ISNULL(s.dbid,1)) AS dbname
, er.command
, er.percent_complete
, dateadd (ms, er.estimated_completion_time, getdate()) AS [Прогноз завершения]
, er.status
, osth.os_thread_id
, ost.pending_io_count
, ost.scheduler_id
, osth.creation_time
, ec.last_read
, ec.last_write
, s.text
, owt.exec_context_id
, owt.wait_duration_ms
, owt.wait_type
FROM master.sys.dm_os_tasks AS ost
JOIN master.sys.dm_os_threads AS osth ON ost.worker_address = osth.worker_address
AND ost.pending_io_count > 0 AND ost.session_id IS NOT NULL
JOIN master.sys.dm_exec_connections AS ec ON ost.session_id = ec.session_id
CROSS APPLY master.sys.dm_exec_sql_text(ec.most_recent_sql_handle) AS s
JOIN master.sys.dm_os_waiting_tasks AS owt ON ost.session_id = owt.session_id
AND owt.wait_duration_ms > 0
JOIN master.sys.dm_exec_requests AS er ON ost.session_id = er.session_id
AND er.percent_complete > 0
AND ost.session_id = 99
ORDER BY ost.session_id
GO

