Em uma tentativa amplamente experimental de reduzir o uso do espaço de tabela, alterei uma char(10)
coluna para char(3)
(O conteúdo da coluna nunca tem mais de três caracteres)
Etapas (não realizadas em um único lote)
use thedatabase;
alter table thetable
alter column thecolumn char(3) null
DBCC CLEANTABLE (thedatabase,'thetable', 500000);
/* Apparently not needed for fixed length column but just in case*/
DBCC SHRINKFILE (1);
A operação foi concluída com êxito, mas a tabela aumentou de tamanho. Eu sei que isso pode acontecer devido à maneira como o mecanismo sql modifica uma coluna (cria uma cópia ao lado e depois copia o conteúdo da coluna), então corri dbcc cleantable
na tabela e depois dbcc shrinkfile
no arquivo do banco de dados. Nenhuma dessas operações fez qualquer diferença no tamanho da tabela.
A tabela não tem índice, portanto não é possível executar uma operação de reconstrução de índice.
Então, minha pergunta é: por que a tabela cresceu, mesmo após comandos para reduzi-la?
Isso provavelmente tem a ver com registros encaminhados, o novo valor char(3) é copiado para uma nova unidade de alocação (página) deixando um ponteiro de encaminhamento em seu lugar. Você pode verificar se eles existem assim.
A única maneira de corrigir isso, já que você está no SQL Server 2005, seria criar um índice clusterizado na tabela e, em seguida, descartá-lo. O SQL 2008 permitiria que você fizesse arquivos
ALTER TABLE <TABLE> REBUILD
.DBCC CLEANTABLE
limpa apenas colunas de comprimento variável digitadas comovarchar
envarchar
, consulte: DBCC CleanTable por Steve Stedman.