Estou executando o sql 2008 r2 e o banco de dados estava funcionando bem e rápido nos últimos 3 anos, até cerca de 3 meses atrás, adicionamos o campo ntext em uma tabela muito ativa e usada. Agora estamos começando a perder espaço no servidor por causa da enorme expansão desta tabela.
Eu li que encolhendo, não queremos perder a indexação do db porque ele estava trabalhando rápido por anos e não queremos que a fragmentação gaste.
Decidimos excluir esse campo e todos os seus valores: Existe uma maneira de excluir o campo ntext e todos os seus valores e liberar espaço sem remover a indexação, sem encolher, sem perder o desempenho do banco de dados?
Estou anexando a saída da consulta de tamanho do banco de dados para mostrar a expansão de tamanho dos últimos 5 meses.
Eu recomendaria usar (de BOL :)
!! CUIDADO !! ( use um tamanho de lote cuidadoso - é aconselhável usar este parâmetro se sua tabela for enorme) :
Uma simples reprodução provará que
DBCC CLEANTABLE
é melhor do que ENCOLHIR (e não se preocupe com a fragmentação :-)Para a maioria das partes, estou fazendo referência à série de blogs Inside the storage engine, de Paul Randall.
A única maneira de recuperar espaço não utilizado de arquivos de banco de dados no SQLServer é usando o comando DBCC SHRINK, que realoca dados nos arquivos de banco de dados, liberando páginas e, após removê-los do mapa Global Allcation, remove-os do arquivo de banco de dados. Essa operação é lenta, cria fragmentação no banco de dados e é ainda mais lenta ao lidar com páginas LOB, pois elas são armazenadas como listas vinculadas nos arquivos do banco de dados.
Como você está descartando a coluna NTEXT, terá que aguardar o processo de limpeza fantasma para descartar os dados antes de encolher.
Agora, ter muito espaço livre nos arquivos do banco de dados não fará mal a você, se você tiver espaço em disco, a compactação de backup cuidará do espaço livre nos arquivos.
Se você realmente deseja tornar os arquivos menores, pode criar um novo grupo de arquivos com o banco de dados e torná-lo o padrão e, em seguida, mover as tabelas para o novo grupo de arquivos, mas isso pode levar tempo e causar inatividade. Usei a técnica explicada aqui por Bob Pusateri com bons resultados.
Você deseja reduzir os arquivos do banco de dados porque precisa desse espaço para outros bancos de dados/arquivos que não são do banco de dados ou porque está tendo problemas com este banco de dados ficando sem espaço?
Se for o segundo, talvez você não tenha um problema tão grande quanto pensa. Se estou correto, seu problema é quando o banco de dados precisa crescer para ganhar espaço adicional para novos dados. Depois de remover a coluna, todo o espaço ocupado por essa coluna será liberado para que novas linhas sejam adicionadas às tabelas no banco de dados. Isso significa que levará mais tempo até que seu banco de dados precise crescer. Nesse meio tempo, eu conseguiria algum espaço adicional para sua unidade de dados. A maioria dos bancos de dados cresce com o tempo e é bom ter uma boa margem de espaço livre na unidade.
Eu criaria uma tabela espelho sem a coluna incorreta, copiaria todos os dados para esta tabela, descartaria o original e então renomearia a tabela espelho.