Como verificar o progresso de DBCC SHRINKFILE?

31

Existe uma maneira de descobrir o progresso da DBCC SHRINKFILEdeclaração?

Aqui está como eu estava executando

dbcc shrinkfile ('main_data', 250000)

Estou executando a instrução acima no SQL Server 2005 e 2008.

[UPDATE] Aqui está a consulta que eu executei para verificar o progresso e o texto que está sendo executado.

select  T.text, R.Status, R.Command, DatabaseName = db_name(R.database_id)
        , R.cpu_time, R.total_elapsed_time, R.percent_complete
from    sys.dm_exec_requests R
        cross apply sys.dm_exec_sql_text(R.sql_handle) T
dance2die
fonte

Respostas:

33

Você verificou percent_complete em sys.dm_exec_requests?

Aaron Alton
fonte
Atualmente verificando como ler os dados retornados dessa DMV.
dance2die
14

A resposta de Aaron é imediata, mas eu gostaria de adverti-lo contra a redução do arquivo de dados, pois isso causa problemas horríveis de desempenho. Eu possuía o código de redução, então sei do que estou falando. Confira esta postagem do blog que escrevi ontem que mostra o que quero dizer e aconselha como efetuar uma redução sem realmente diminuir: Por que você não deve reduzir seus arquivos de dados

Espero que isto ajude!

PS Mais uma coisa para verificar se está demorando muito e o percent_complete não está aumentando - procure por bloqueio. O psiquiatra espera infinitamente pelos bloqueios necessários.

Paul Randal
fonte
4
"Eu possuía o código de redução, então sei do que estou falando." legais!
splattne
11
Estava demorando uma eternidade para reduzir o arquivo de dados 600G ... Vou lê-lo e considerar o uso da desfragmentação de índice. Obrigado Paul!
dance2die
11
lembre-se de que encontrei esta resposta porque estava procurando progresso no DBCC SHRINKFILE (MyFile, EMPTYFILE) ... Estou movendo dados entre unidades adicionando um arquivo ao grupo de arquivos na nova unidade, esvaziando o original e soltando-o.
Sam Saffron
@Paul, estou observando que a redução de um arquivo para um tamanho de destino demora um pouco, mas é concluída (eu vejo o tamanho do arquivo) - mas, embora pareça ter sido concluída com êxito, o processo de piscar ainda continua e é executado para sempre. Mesmo com quantidades menores (alguns MBs ou maiores (1 GB) de volume shink). O sys.dm_exec_requests mostra continuamente uma atividade sem fim, alterando os bloqueios de recursos e, ao mesmo tempo, percent_completion acumulando algo em torno de 32,8%. Neste ponto, CANCELO o processo e celebro oficialmente um sucesso - sabendo que ALGO ainda estava acontecendo ... alguma idéia do que está errado? 2008r2
Magier
O link para a postagem do blog está quebrado, isso parece ser válido agora: sqlskills.com/blogs/paul/…
Jonathan Gilbert
5
SELECT 
    d.name,
    percent_complete, 
    session_id,
    start_time, 
    status, 
    command, 
    estimated_completion_time, 
    cpu_time, 
    total_elapsed_time
FROM 
    sys.dm_exec_requests E left join
    sys.databases D on e.database_id = d.database_id
WHERE
    command in ('DbccFilesCompact','DbccSpaceReclaim')
Francisco Figueiredo
fonte
2
Pode ser útil incluir uma descrição do que seu código faz na sua resposta
BE77Y 16/15/15
+1 para uma excelente consulta, mas -1 para repetir o que o OP disse seis anos após o fato. Se sua consulta for melhor do que a dele em algum sentido, descreva-a, caso contrário, será apenas um desperdício de espaço.
5

A consulta abaixo mostra o resultado da seguinte maneira: controlar o status de redução do dbcc

-------------------------------
--Track DBCC shrink status
-------------------------------
select
a.session_id
, command
, b.text
, percent_complete
, done_in_minutes = a.estimated_completion_time / 1000 / 60
, min_in_progress = DATEDIFF(MI, a.start_time, DATEADD(ms, a.estimated_completion_time, GETDATE() ))
, a.start_time
, estimated_completion_time = DATEADD(ms, a.estimated_completion_time, GETDATE() )
from sys.dm_exec_requests a
CROSS APPLY sys.dm_exec_sql_text(a.sql_handle) b
where command like '%dbcc%'
Mark Varnas
fonte
3

Adicionando minha própria versão para qualquer pessoa interessada, isso converte as colunas de milésimos de segundo em minutos e segundos mais legíveis.

select 
[status],
start_time,
convert(varchar,(total_elapsed_time/(1000))/60) + 'M ' + convert(varchar,(total_elapsed_time/(1000))%60) + 'S' AS [Elapsed],
convert(varchar,(estimated_completion_time/(1000))/60) + 'M ' + convert(varchar,(estimated_completion_time/(1000))%60) + 'S' as [ETA],
command,
[sql_handle],
database_id,
connection_id,
blocking_session_id,
percent_complete
from  sys.dm_exec_requests
where estimated_completion_time > 1
order by total_elapsed_time desc
user5947282
fonte
-1

Ou você pode simplesmente executar o exec sp_who3.

darotweiler
fonte
2
Isso precisaria de uma explicação melhor.
Sven