Medindo o progresso de queries em SQL Server com DBCC!

Então, hoje, depois de conseguir corromper uma base de dados tive de usar um bando de truques para conseguir restaurar a base de dados. Um dos passos envolve usar o comando DBCC CHECK que leva muito tempo. Após uns 30 minutos estava em pânico e impaciente porque o processo demorava e não tinha ideia de quanto o processo já havia corrido. Como todo bom Googler fui googlar, e eis que achei a solução: Dynamic Management Views (DMVs).

Então, hoje, depois de conseguir corromper uma base de dados tive de usar um bando de truques para conseguir restaurar a base de dados. Um dos passos envolve usar o comando DBCC CHECK que leva muito tempo. Após uns 30 minutos estava em pânico e impaciente porque o processo demorava e não tinha ideia de quanto o processo já havia corrido. Como todo bom Googler fui googlar, e eis que achei a solução: Dynamic Management Views (DMVs).

As DMVs (e algumas funções) retornam dados sobre o estado do server, que podemos usar para monitorar a ‘saúde’ de um server. A DMV em destaque é sys.dm_exec_requests, que permite ver quais os processos ou pedidos em execução. A DMV retorna os dados para várias base de dados, mas podemos sempre filtrar usando a clausula WHERE como abaixo:

SELECT session_id ,
    request_id ,
    percent_complete ,
    estimated_completion_time ,
    DATEADD(ms, estimated_completion_time, GETDATE()) AS TempoEstimado,
    start_time,
    status,
    command,
    *
FROM sys.dm_exec_requests
WHERE database_id = 23

No caso do DBCC CHECK ele internamente subdivide-se em 3 outros processos, cada um com seu progresso respectivamente:

  • DBCC CHECKALLOC
  • DBCC CHECKTABLE
  • DBCC CHECKATALOG

Para ver o progresso destes processos também, podemos fazer o JOIN com a DMV sys.dm_os_tasks que lista todas as tarefas do OS com base no ID da sessão.

SELECT *
FROM sys.dm_exec_requests r
    JOIN sys.dm_os_tasks t on r.session_id = t.session_id
WHERE r.session_id = 69