Estou fazendo um projeto que adiciona algumas colunas a uma tabela bastante mal projetada e notei que há muito espaço desperdiçado.
Eu vejo muitos posts sobre como adicionar colunas no final sendo relativamente rápido e barato (por razões que não entendo muito bem - os links de acompanhamento estavam quebrados), e vejo muitos posts sobre o quão caro é crescer colunas, e como basicamente se resume a "criar uma nova tabela e copiar todos os dados antigos para ela" (na verdade, o ssms faz isso com o Gerar script, independentemente da alteração que você fizer).
Estou curioso sobre uma preocupação mais de nicho, eu acho - alterar colunas para tamanhos de dados menores e como fazer isso com eficiência.
Especificamente, esta tabela tem várias colunas de data e hora que realmente querem apenas a data. Na verdade, o sql está fazendo toda a aritmética de data para tirar o tempo de GETDATE(). Eu quero
ALTER TABLE Foo ALTER COLUMN BAR DATE NULL
Mas não quero incorrer em todas as despesas de criar uma tabela temporária e reescrever os dados antigos (se puder evitar).
Parece que todos os dados antigos estariam bem, apenas menores.
E espero que liberar esse espaço no bloco torne os novos requisitos que tenho para adicionar menos onerosos (mas obviamente não entendo os detalhes internos profundos da alocação de linhas).
Então, que tal ir para tipos menores de tamanho fixo com uma instrução ALTER? Isso vai ficar bem e não explodir o log?
Obrigado
Alterar de DATETIME para DATE altera a representação binária do valor, de modo que a sobrecarga será semelhante à do aumento de tamanho.
IIRC, a única alteração que pode ser apenas metadados é aquela que não altera a representação binária, como mudar de VARCHAR(100) para VARCHAR(50), e algumas podem nem exigir a verificação dos dados para garantir que eles se encaixem, como mudando de VARCHAR(50) para VARCHAR(100).
Qualquer alteração no tipo de dados que não seja apenas metadados exigirá atualização física das linhas e causará uma sobrecarga semelhante, pois a linha inteira precisa ser registrada.