Como posso remover espaço não alocado de um banco de dados do SQL Server?

2

Eu tenho um banco de dados que foi recentemente reduzido e quando eu corro sp_spaceused eu vejo que ele tem 500MB de espaço não alocado. Eu estou tentando manter este banco de dados para um determinado tamanho (fazer restrições de tamanho de MSDE para meus usuários de desktop) e não tenho certeza se o espaço não alocado afeta o tamanho do banco de dados geral. Existe uma maneira de remover esse espaço não alocado do banco de dados?

    
por Sean Howat 05.06.2009 / 21:58

5 respostas

6

Tenha muito cuidado com a redução de execução para arquivos de dados, isso causa a fragmentação do índice por causa do algoritmo que ele usa (eu costumava ter o código quando estava no MS). Esta postagem do blog que eu escrevi contém um script de exemplo que mostra o que quero dizer Auto-shrink - desligue-o! . Embora o título do post do blog seja sobre o auto-shrink, o encolhimento manual de arquivos de dados usa exatamente o mesmo código no SQL Server e, portanto, tem os mesmos problemas.

Se você estiver usando apenas a opção TRUNCATEONLY, como diz Kyle, não fará nenhum movimento de dados nem causará fragmentação.

Se você tiver índices no banco de dados, você tem duas opções:

  1. Execute a redução e remova a fragmentação do índice posteriormente. Não faça isso usando a reconstrução de índice (como será necessário aumentar novamente o banco de dados para obter espaço para o novo índice). Use o meu antigo DBCC INDEXDEFRAG ou seu substituto ALTER INDEX ... REORGANIZE. Isso só precisa de uma página de dados para funcionar e, portanto, não aumentará o banco de dados novamente.
  2. Crie outro grupo de arquivos no banco de dados, mova todos os índices para ele usando a sintaxe CREATE INDEX ... WITH DROP_EXISTING e, em seguida, elimine o grupo de arquivos antigo.

Espero que isso ajude!

    
por 05.06.2009 / 22:22
1

Veja DBCC SHRINKFILE

    
por 05.06.2009 / 22:09
1

O SqlACID está certo e analisa especificamente TRUNCATEONLY ou target_size

    
por 05.06.2009 / 22:16
0

Por que você quer diminuir? Os bancos de dados tendem a crescer à medida que mais dados são colocados neles. Está na natureza deles. Não há nada de errado em ter espaço não utilizado no arquivo de dados. Na verdade, o SQL precisa de algum espaço livre no arquivo.

O encolhimento causa fragmentação massiva e apenas resultará no arquivo de dados crescendo novamente na próxima vez em que os dados forem adicionados. Quando isso acontece, todo o sistema fica mais lento quando o arquivo é expandido (especialmente se você não tiver uma inicialização instantânea). Também repetidos encolhe e cresce, causando fragmentação no nível do sistema de arquivos, o que é difícil de consertar.

    
por 06.06.2009 / 13:39
0

pode-se querer encolher se vemos um enorme espaço não alocado, digamos de 150 GB ou mais. Eu vi um caso em que o sp_spaceused diz alto não alocado, mas o DBCC SHRINKFILE não ajuda. Então, é necessário ou devo dizer obrigatória para usar o lado de destino nesse cenário

    
por 10.06.2010 / 18:14