Por que o status "DbccFilesCompact" é "Suspenso"?


11

Estou executando o arquivo SHRINK em um arquivo de dados 600G.

Atualmente, o status é relatado como "suspenso" e, sys.dm_exec_requests.percent_completepara DbccFilesCompactrelatórios de comando, está em execução (mas muito lentamente)

Existe uma maneira de verificar por que está sendo suspenso e como torná-lo mais suave?


FYI - Consulta SQL para verificação de status

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
order by Command

Respostas:


10

Não, você não pode verificar por que está lento, mas posso lhe dar algumas dicas:

1) No SQL 2005, o gerenciamento de índices não clusterizados mudou do mecanismo de armazenamento (minha equipe) para o processador de consultas. Isso tem muitos efeitos colaterais, um dos quais é a velocidade com que as páginas de dados da pilha podem ser movidas por redução. Todos os registros de índice não clusterizados contêm um backlink para o registro de dados que estão indexando - no caso de um heap, esse é um link físico para um número de registro em uma página de dados específica. Quando uma página de dados de heap é movida por redução, todos os registros de índice não clusterizados que se vinculam aos registros dessa página devem ser atualizados com o novo local da página. Em 2000, isso foi feito com muita eficiência pelo próprio mecanismo de armazenamento. A partir de 2005, isso deve ser feito chamando o Query Processor para atualizar os registros de índice não clusterizados. Às vezes, isso é até 100 vezes mais lento que em 2000.

2) Os valores LOB fora da linha (tipos de dados LOB reais ou dados de estouro de linha) não contêm um backlink para os dados ou registro de índice dos quais fazem parte. Quando uma página dos registros LOB é movida, toda a tabela ou índice do qual eles fazem parte deve ser varrida para descobrir quais dados / registros de índice apontam para eles, para que possam ser atualizados com o novo local. Isso também é muito, muito lento.

3) Pode haver outro processo usando o banco de dados que está causando o bloqueio diminuir a espera pelos bloqueios necessários para mover as páginas.

4) Você pode ter o isolamento de instantâneo ativado e o shrink não pode mover páginas com links de armazenamento de versão até que as transações que exigem essas versões mais antigas sejam concluídas.

5) Seu subsistema de E / S pode estar com pouca energia. Um comprimento da fila de disco maior que um dígito baixo significa seu subsistema de E / S no gargalo.

Qualquer um ou todos esses fatores podem contribuir para diminuir os tempos de execução.

Em geral, porém, você não deseja executar o psiquiatra. Consulte esta postagem do blog para obter detalhes: Por que você não deve reduzir seus arquivos de dados .

Espero que isto ajude!


1
@ Paul Randal: Agradeço seu comentário e o link para por que o psiquiatra não deve ser executado, a menos que seja necessário. Vou tentar a recomendação (movendo arquivos para um grupo de arquivos diferente) e ver como fica.
dance2die

8

Você pode executar este script para verificar a porcentagem concluída!

SELECT 
    percent_complete, 
    start_time, 
    status, 
    command, 
    estimated_completion_time, 
    cpu_time, 
    total_elapsed_time
    --,*
FROM 
    sys.dm_exec_requests
WHERE
    command = 'DbccFilesCompact'

2

Estou encolhendo um banco de dados no SQL Server 2008 SP1 e uma maneira de saber o progresso do comando Shrink é executando sp_lock spid e, na maior parte do tempo, vejo que ele bloqueia o arquivo 1 e, quando pronto, coloca um bloquear no arquivo id 2, e assim por diante e desta maneira eu posso dizer quando ele está trabalhando no último arquivo id e esta é minha indicação de que está quase completo.

Obrigado,

Alex Aguilar


Qual é o tamanho do seu Db?
John Zabroski

0

Descobri qual era o problema (no meu caso) e ofereço aqui a solução que usei.

Eu não tinha nada usando o banco de dados, e o mestre era o banco de dados padrão na minha sessão, verifiquei usando sp_who2. Então, cliquei com o botão direito do mouse no banco de dados, selecione "tarefas", "encolher" e "ok" na caixa de diálogo. Cheking novamente com sp_who2, o status é "suspenso" por vários minutos e depois disso abortado, porque "nenhum bloqueio exclusivo pode ser obtido". Adivinhe, mas tenho certeza de que o próprio diálogo é o que causa isso.

Então eu decidi ir através da linha de comando usando:

DBCC SHRINKDATABASE (myDataBase)

(A bruxa está documentada em toda parte). Então o psiquiatra levou apenas alguns segundos.


1
DBCC SHRINKDATABASEdeve ser evitado porque reduzirá todos os arquivos do banco de dados - qualquer arquivo de dados e qualquer arquivo de log.
Zac Faragher

Acordado. Nós o usamos apenas em ambientes de desenvolvimento. Útil para economizar espaço em disco na AWS, onde o disco é medido.
John Zabroski
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.