Как вы наверняка знаете, повторное исполнение команды 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
В сценарии использованы
следующие административные представления и функции:
sys.dm_os_tasks
sys.dm_os_threads
sys.dm_exec_connections
sys.dm_exec_sql_text
sys.dm_os_waiting_tasks
sys.dm_exec_requests
Текст сценария:
--
Процент исполнения длительного запроса ввода-вывода
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
Комментариев нет:
Отправить комментарий