В 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