Como verificar o progresso do DBCC SHRINKFILE?

30

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

Aqui está como eu estava rodando

dbcc shrinkfile('main_data', 250000)

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

[UPDATE] Aqui está a consulta que fiz 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
    
por Sung Kim 25.06.2009 / 15:44

6 respostas

33

Você verificou percent_complete em sys.dm_exec_requests?

    
por 25.06.2009 / 15:48
14

A resposta de Aaron está correta, mas eu gostaria de alertar você contra a execução do arquivo de dados encolher, pois isso causa problemas horríveis de desempenho. Eu costumava possuir o código de contração, então eu sei do que estou falando. Finalize este post do blog que escrevi ontem que mostra o que quero dizer e aconselho como contrair um psiquiatra sem fazer um psiquiatra: Por que você não deve encolher seus arquivos de dados

Espero que isso ajude!

PS Mais uma coisa para verificar se está demorando e o percent_complete não está aumentando - procure por bloqueio. O Shrink irá infinitamente - espere pelos bloqueios de que precisa.

    
por 25.06.2009 / 17:27
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')
    
por 16.06.2015 / 12:06
4

A consulta abaixo mostrará o resultado assim: acompanhe 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%'
    
por 18.08.2017 / 22:38
3

Adicionando minha própria versão para qualquer pessoa interessada, isso converte as colunas de tempo em milissegundos 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
    
por 15.11.2016 / 18:57
-1

Ou você pode simplesmente executar exec sp_who3.

    
por 07.03.2018 / 10:40