Percebi que, ao alterar o tipo de dados de uma coluna, o tamanho da tabela pode dobrar com uma simples instrução ALTER ( Recuperando espaço após alteração do tipo de dados da coluna ).
Por que o SQL Server faz isso e o que o causa?
Eu vi postagens sobre como resolver o problema, como observar o problema, mas nada sobre por que isso está acontecendo e o que o SQL Server está fazendo nos bastidores.
O método aparentemente correto é criar uma nova tabela, colocar todos os dados na nova tabela com o tipo de dados correto, descartar a tabela antiga e sp_rename a nova tabela (como visto quando você faz o script da alteração usando o Designer no SSMS ). Mas é estranho que uma alteração de tabela simples não forneça um aviso ou mensagem de erro quando considera a operação que "requer recriação de tabela".
Depende da natureza do
ALTER
. Muitas vezes, isso é implementado criando uma nova coluna, copiando os dados e marcando a coluna antiga como descartada. Exemplo:E, olhando para a linha no visualizador interno do SQL Server, você pode ver claramente isso
Você também pode ver os resultados da consulta em Inspeção da estrutura da tabela física
Existem várias coisas possíveis que podem contribuir.
No caso acima, o tamanho da linha foi duplicado com um único , de
ALTER COLUMN
modo que explicaria facilmente a duplicação geral do tamanho da tabela.Mesmo no caso de a própria linha não dobrar de tamanho, o fato de a linha ficar mais larga pode causar divisões de página e aumentar o nível de fragmentação interna. Este é o caso do artigo que você vinculou. Vai de ter páginas 99,8% cheias para 55% cheias. Cada página de folha precisava ser dividida, pois não havia espaço suficiente para acomodar as linhas mais largas, de modo que dobrava o número de páginas de folha.
Além disso, às vezes as alterações anteriores que foram implementadas apenas como metadados são adiadas e serão gravadas na linha agora que está sendo atualizada de qualquer maneira. Um exemplo de tal alteração seria
ALTER TABLE T1 ADD Y CHAR(12) NULL
esta é geralmente uma alteração apenas de metadados no momento da execução e a linha física não será atualizada para refletir os 12 bytes adicionais para esta coluna até a próxima vez que ela precisar ser gravada.