Tips for DBA: Percentage of work completed for DBA commands

Как вы наверняка знаете, повторное исполнение команды KILL для сеанса показывает процент завершения отката прерванной инструкции. Это замечательная возможность, которая позволяет сберечь нервы администратора баз данных. Однако, есть и другие долгоиграющие команды, процент завершения которых тоже интересно было бы отслеживать. Ну, например, примерно таким же образом, как сообщает о прогрессе своей работы команда BACKUP. Вашему вниманию предлагается сценарий, который позволяет отслеживать прогресс исполнения следующих команд:
- 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
, 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