Tenho apenas 2 GB restantes, então preciso remover essa tabela de histórico. Esta tabela agora está vazia, mas o espaço em disco do banco de dados não foi liberado. E o arquivo de banco de dados é de 320 GB.
relate perguntas
-
SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado
-
Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?
-
Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?
-
Quais são as principais causas de deadlocks e podem ser evitadas?
-
Como determinar se um Índice é necessário ou necessário
Se você estiver referenciando o consumo real de arquivos de banco de dados no volume, o SQL Server não lidará com isso automaticamente . Só porque você removeu dados do banco de dados não significa que os arquivos do banco de dados serão reduzidos para caber apenas nos dados existentes.
O que você estaria procurando, se precisar recuperar espaço no volume, seria reduzir o arquivo específico com
DBCC SHRINKFILE
. Vale a pena observar algumas práticas recomendadas, conforme essa documentação:Também digno de nota:
Certamente há algumas coisas a serem consideradas ao fazer isso, e eu recomendo que você dê uma olhada no post do blog de Paul Randal sobre o que acontece quando você faz essa operação.
O primeiro passo definitivamente seria verificar quanto espaço e espaço livre você realmente pode substituir, bem como o espaço usado no(s) arquivo(s):
Este é um comportamento normal ao truncar a tabela e que envolve a remoção de mais de 128 extensões conforme os Manuais Online
Você teria que esperar e, é claro, teria que reduzir manualmente o arquivo para recuperar espaço também vale a pena mencionar que a redução causa fragmentação lógica e deve ser evitada, a menos que sua necessidade seja grave. Você teria que equilibrar de alguma forma entre o encolhimento e a fragmentação. É melhor se perguntar se a redução realmente resolveria o problema, considerando o cenário em que os dados voltarão a crescer de qualquer maneira.
Use a consulta abaixo para verificar quanto espaço livre existe no banco de dados
Além das respostas de Tom e Shanky, se seu banco de dados contiver dados LOB/BLOB, o DBCC SHRINKFILE pode não funcionar. Se for esse o caso, você tem duas opções, dependendo se pode colocar o banco de dados offline ou não. Se você puder colocar o banco de dados offline, precisará copiar os dados e copiá-los de volta para remover o espaço vazio. Você pode fazer isso por um dos seguintes:
Se você não puder colocar o banco de dados offline, poderá usar o comando DBCC SHRINKFILE com a opção EMPTYFILE .
Detalhes para cópia offline: http://support.microsoft.com/kb/324432/en-us
Informações atuais para a opção EMPTYFILE http://msdn.microsoft.com/en-us/library/ms189493(v=sql.105).aspx
Para entender melhor por que o SQL não recupera espaço automaticamente quando você exclui dados, pense nos arquivos de dados do SQL Server como uma unidade de autoarmazenamento comercial:
Os dados de tabelas e índices são organizados nessas unidades (chamadas "páginas"), e o SQL Server é muito meticuloso em acompanhar o que pertence a onde.
Se você encher todas as unidades de armazenamento, poderá comprar terrenos e construir mais (expandindo o arquivo de dados), mas o que acontece quando algumas unidades são esvaziadas?
Não só está movendo todas essas unidades em torno de muito trabalho (desnecessário), mas também pode causar fragmentação de tabela e índice , o que pode afetar o desempenho.
Imagine se você tivesse uma família que comprasse 10 unidades uma ao lado da outra e, mais tarde, você os forçasse a mover 4 dessas unidades para unidades vazias aleatórias em outro local da instalação. Quando eles vierem adicionar ou remover coisas de suas unidades, eles terão que fazer muito trabalho extra vagando entre as unidades espalhadas.
Obviamente, essa analogia não é perfeita e, claramente, há situações em que você realmente deseja reduzir um arquivo de dados, mas não deseja que o SQL Server faça isso sozinho, deseja controlar quando e como exatamente isso acontece.
Por exemplo, você provavelmente gostaria de fazer um
DBCC SHRINKFILE
para um tamanho específico, deixando uma parte do espaço livre interno e, em seguida, seguir imediatamente por uma reindexação/desfragmentação de suas tabelas/índices, para corrigir qualquer fragmentação que você acabou de criar.Moral desta história: Nunca ligue o AutoShrink!