Eu tenho uma tabela que possui 483 colunas.
A date not null
, a char(6) not null
e então 481 x float sparse null
.
Pelas minhas contas, mesmo que todo float esparso não seja nulo, a linha ainda deve ser apenas:
date: 3 bytes
char(6): 6 bytes
sparse float: 12 bytes x 481
sparse update overhead: 2 bytes x 483
= 6747 bytes and way below the limit of 8060
(even allowing lots for other random overheads)
Na verdade, a linha real que causa o problema ainda tem 133 colunas flutuantes como nulas e o SQL Server afirma que essa linha tem um tamanho de linha de 8108 (e é muito grande).
Qual é o fantasma que está ocupando meu espaço na fila?
A tabela contém colunas de comprimento fixo que foram eliminadas. Isto pode acontecer como parte de uma conversão de dados ou através de desenvolvimento iterativo, onde a ferramenta modifica a estrutura da tabela existente à medida que o design evolui.
Como David Browne apontou, isso também pode acontecer como resultado da criação inicial das
float
colunas (comprimento fixo) como null não esparsas e, em seguida, alterá-las para sparse .Isso contradiz a documentação (ênfase adicionada):
Na verdade, a estrutura não é reconstruída para recuperar espaço.
Exemplo
Altere as colunas flutuantes para esparsas:
Mostre as colunas eliminadas usando uma visualização do sistema não documentada:
As primeiras dez entradas mostradas apenas por questões de brevidade:
Atualize a linha com valores para todas as colunas flutuantes, exceto 133:
A mensagem de erro é:
Para remover as colunas de comprimento fixo descartadas 'fantasma', você precisa reconstruir a tabela:
A operação anterior agora foi bem-sucedida.
db<> demonstração de violino
Colunas de comprimento fixo não podem ser limpas com
DBCC CLEANTABLE
.Colunas de comprimento variável eliminadas não causam problemas porque o SQL Server pode limpá-las ou movê-las para fora da linha para liberar espaço ao adicionar uma nova coluna esparsa.