Eu não sou um dba... vamos começar com isso :) Eu sou um desenvolvedor de aplicativos. Mas nosso banco de dados tem uma tabela de arquivamento com 252 milhões de linhas e 170 GB, e recebi a tarefa de corrigi-la (na verdade, existem várias tabelas nesta categoria que preciso limpar). Mas decidimos que não precisamos manter nenhum desses dados. Como essa tabela é uma tabela de arquivamento, quero dizer que há uma tabela de transações primária para esses dados, mas o aplicativo tem uma maneira de manter a tabela de transações menor arquivando ou movendo registros mais antigos para essa tabela de arquivamento.
Sendo uma tabela de arquivo, ela não possui dependências por SSMS (sem índices ou chaves estrangeiras). Este banco de dados está definido para o modo de recuperação completa.
Temos janelas de manutenção curtas, por isso precisamos de um processo rápido e temos espaço em disco limitado, por isso precisamos recuperar o espaço em disco dessa tabela.
Podemos truncar a tabela, mas como recuperar o espaço? Não queremos fazer uma redução de banco de dados, pois ela reduz todas as tabelas e, portanto, precisaríamos executar recompilações de índice... pelo menos esse é o meu entendimento, o que pode estar incorreto.
Eu poderia salvar um script do SSMS (Script Table as Create To...). Então largue a mesa e recrie-a... Isso é arriscado? Será que vai recuperar o espaço?
Outras ideias?
Como você tem experiência limitada com administração de banco de dados, seja extremamente cuidadoso. Você tem uma cópia de teste do seu servidor de banco de dados configurado, certo?
Você mencionou que o banco de dados usa o modelo de recuperação completa. Isso é MUITO importante, porque se os logs de transação não estiverem sendo copiados com frequência suficiente, não há como reduzi-los. Você teria que colocar o banco de dados no modo de recuperação simples (que, para todos os efeitos, elimina o log de transações) e esperar enquanto isso processa, então você pode seguir em frente. Dada a quantidade de dados, imagino que demoraria um pouco. Para obter informações sobre os modelos de recuperação, acesse aqui: https://learn.microsoft.com/en-us/sql/relational-databases/backup-restore/recovery-models-sql-server Este artigo fornece uma visão geral básica.
Para responder à sua pergunta, truncar ou descartar a tabela de arquivamento não liberará espaço - é isso que o encolhimento do banco de dados faz. Tudo o que o truncate/drop faz é marcar as páginas apropriadas no banco de dados como não utilizadas. Há pouco sentido em largar a tabela e recriá-la. Um truncado basicamente obtém o mesmo resultado final e é menos propenso a erros.
Lembre-se de que, se este aplicativo enviar mais dados para esta tabela de arquivamento, o banco de dados será expandido depois que você executar o procedimento de redução! (Você está realmente usando o SQL Server 2005? Em caso afirmativo, considere seriamente atualizar para uma versão com suporte e obter um hardware mais novo se for um servidor físico.) Assim, assim como o aplicativo move dados para a tabela de arquivamento, você deve considerar a implementação de uma maneira para remover dados desnecessários da tabela de arquivamento para evitar essa situação no futuro. Mas as primeiras coisas primeiro.
Se você ainda não leu, leia isto: https://learn.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-shrinkdatabase-transact-sql É um documento da Microsoft que descreve a redução um banco de dados com alguns bons detalhes. Esta é uma visão geral decente e contém algumas práticas recomendadas, bem como advertências.
Se você não quiser reduzir o banco de dados, sua outra opção é criar um novo banco de dados, transferir para ele o que deseja manter do banco de dados antigo e, em seguida, descartar o banco de dados antigo. Claro, isso vai ocupar um pouco de espaço em disco e tempo. Também colocará o servidor sob carga considerável.
Você está correto em que uma redução de banco de dados pode aumentar a fragmentação do índice. Dito isto, tal fragmentação pode não ter um efeito perceptível no desempenho. É por isso que você tem um servidor de teste. :-)
Talvez seja necessário ajustar sua janela de manutenção para esta operação. Vai demorar o tempo que for preciso. Enquanto o truncar estiver em andamento, o banco de dados estará online. Você também pode manter o banco de dados online durante uma redução. O desempenho pode sofrer visivelmente dependendo do uso, como as consultas são ajustadas, hardware e configuração do sistema operacional. Novamente, teste antes de fazer qualquer coisa na produção! Um encolhimento pode ser interrompido e iniciado posteriormente, no entanto, se o espaço for escasso, iniciar e parar anula o objetivo.
Mais uma coisa: dependendo da rapidez com que os dados são adicionados a esse banco de dados, truncar e reduzir pode apenas atrasar o inevitável. Considere adicionar capacidade de armazenamento.
Se você tiver mais detalhes ou esclarecimentos, atualizarei minha resposta de acordo. Enquanto isso, boa sorte, e deixe-nos saber como as coisas vão!