Tenho uma tabela de quase um milhão de linhas com duas colunas de datatype varbinary
. Essas duas colunas armazenam dados binários que fazem o banco de dados crescer para 1 TB.
Como esse banco de dados também é restaurado em outros ambientes de controle de qualidade e em um ambiente de desenvolvimento, agora temos a tarefa de recuperar o máximo de espaço possível para economizar custos.
Após envolver o fornecedor, eles informaram que essas duas colunas podem ser descartadas, pois não estão mais em uso. A escrita do aplicativo para essas duas colunas foi modificada de acordo.
Eu segui duas opções para abordar a situação no meu ambiente de desenvolvimento, mas preciso de ajuda sobre a abordagem correta.
Opção 1
- Solte as duas colunas binárias
- Executar
DBCC CLEANTABLE
- Esta etapa levou quase 24 horas. Tive que pará-la porque não terei tanto tempo no ambiente de produção. - Encolher o sistema de arquivos - Estou um pouco relutante em fazer isso por causa da fragmentação.
Fiquei preso no número 2 acima e então tentei a segunda opção abaixo.
Opção 2
- Solte as duas colunas binárias
- Crie uma nova tabela e copie os dados usando o SSIS - Esta operação levou quase 12 horas para ser concluída (não terei tanto tempo em produção)
- Crie um sistema de arquivos diferente e mova todas as tabelas e outros objetos para este novo sistema de arquivos de tabela, exceto a tabela antiga em questão, usando o
CREATE INDEX…WITH DROP_EXISTING = ON, ONLINE = ON
comando - Solte a tabela antiga no sistema de arquivos primário
- Encolher o sistema de arquivos primário - Espero que isso encolha mais rápido, pois não há muitos objetos nele.
O item 2 levou quase 12 horas para ser concluído. Alguém conhece uma abordagem melhor para se livrar dessas duas colunas e recuperar o espaço?
O ambiente de produção tem AOAG (Always On), o que significa que preciso estar em recuperação total.
O uso DBCC CLEANTABLE
demorou muito e meu log estava crescendo. Tive que parar para tentar a opção 2. Depois de correr por mais de 24 horas, parei. Demorou muito para finalmente parar. Foi nesse ponto que pensei que DBCC CLEANTABLE
não era uma boa opção para mim.
Por que SSIS? Você poderia simplesmente usar um
INSERT...SELECT
e adicionarTABLOCKX
dicas.Além disso,
DBCC CLEANTABLE
você pode definir um tamanho de lote (padrão 1000 linhas) para que você possa executá-lo durante o horário de trabalho. – CharliefaceIsso significa que você pode pará-lo a qualquer momento e o trabalho que ele comprometeu será preservado. Ele continuará de onde parou na próxima vez que você executá-lo.
Com 1 TB de dados em menos de um milhão de linhas, o tamanho médio das linhas deve ser superior a 1 MB, o que significa que há muitas colunas, grandes colunas LOB ou ambos.
Nesse caso, especificar um tamanho de lote menor do
DBCC CLEANTABLE
que o padrão pode ser importante. Rollbacks com colunas LOB grandes podem ser muito lentos. Reduzir o tamanho do lote pode ajudar com isso.O quanto menor você torna o tamanho do lote depende de quão lenta foi a recuperação da interrupção do padrão. Faça seu melhor palpite e experimente. Não há informações na pergunta para especular.
DBCC CLEANTABLE
não libera espaço liberado. As páginas liberadas geralmente estarão espalhadas por todo lugar. Você precisa de uma operação de redução para consolidar o espaço livre no final do(s) arquivo(s) para que eles possam ser truncados.DBCC CLEANTABLE
não deve falhar devido à atividade simultânea, mas também não ajudará. Pode causar bloqueio temporário. Idealmente, você não teria nenhuma atividade simultânea. Usar recuperação simples não acelerariaDBCC CLEANTABLE
.Ou tente os métodos
SELECT INTO
orINSERT...SELECT
em vez disso, embora reescrever 1 TB de dados provavelmente também não seja rápido. Depende de quantos dados restam depois que as duas colunas são descartadas, o que a pergunta não especifica. Se você puder alterar o modelo de recuperação, isso pode ajudar, dependendo do seu hardware.Use os
DBCC SHRINK
comandos para recuperar espaço após concluirDBCC CLEANTABLE
ou criar a nova tabela e remover a antiga. Pode demorar um pouco, mas também é possível retomar. Mover os dados novamente para um novo grupo de arquivos parece contraproducente.Algumas operações grandes simplesmente não podem ser concluídas em uma única janela, dadas as restrições ambientais. Com planejamento correto, você pode concluir o trabalho ao longo de um período de tempo. O mesmo com a recuperação de espaço.
Como você está usando o modelo de recuperação simples ou em massa e está usando uma dica de bloqueio de tabela, provavelmente agora está usando operações em massa minimamente registradas e também pode obter uma inserção paralela .
Em vez de ter que registrar cada registro no log de transações, agora você está registrando apenas informações de alocação (e imagens de página inteira na confirmação), o que acelera muito a cópia.
Se você não puder usar o registro mínimo, ainda poderá obter dados paralelos sendo carregados
INSERT...SELECT
em um heap (tabela sem índices, nem mesmo um índice clusterizado) ouSELECT INTO
.