No SQL Server, por que um tinyint é armazenado com 9B na linha. Por alguma razão, parece haver um byte adicional no final da máscara de bitmap NULL.
USE tempdb ; VAI CRIAR TABELA tb ( i TINYINT NÃO NULO ); VAI INSERIR EM tbl (i) VALORES (1) ; VAI DBCC IND ('tempdb','tbl',-1); VAI DBCC TRACEON (3604); -- Despejo de página irá para o console VAI PÁGINA DBCC ('tempdb',1,168,3); VAI
Resultados (inverti os bytes devido a DBCC PAGE mostrando o byte menos significativo primeiro):
Record Size = 9B
10000500 01010000 00
TagA = 0x10 = 1B
TagB = 0x00 = 1B
Null Bitmap Offset = 0x0005 = 2B
Our integer column = 0x01 = 1B
Column Count = 0x0001 = 2B
NULL Bitmap = 0x0000 = 2B (what!?)
Se você calcular o registro usando a adição de tamanho simples, você realmente obterá 8: 4+1+2+1 (cabeçalho+tamanho fixo+contagem de bitmap nulo+ próprio bitmap nulo). Mas um registro de heap não pode ser menor que o tamanho do stub de encaminhamento , que é de 9 bytes, pois o registro deve garantir que possa ser substituído por um stub de encaminhamento. Portanto, o registro terá na verdade 9 bytes. A
smallint
será de 9 bytes por meio de computação e tamanho mínimo. Qualquer coisa maior já é maior do que o stub de encaminhamento, portanto, o tamanho da computação corresponde ao tamanho do registro.É bom ter o ouvido do autor. :-) Kalen suspeita que isso seja apenas a imposição de algum tipo de comprimento mínimo de linha, onde qualquer coisa < 9 é preenchida para 9. É claro que existem apenas alguns casos em que isso é possível. Você encontrará este byte fantasma para TINYINT e BIT, bem como VARCHAR(1)/CHAR(1). Não aumentará além de 9 se você mover para SMALLINT ou CHAR(2), mas aumentará se você mover para, digamos, CHAR(3).
Então, basicamente, você pode apontar as eficiências que pode obter ao escolher os tipos de dados com sabedoria, mas apontar que existem alguns casos extremos em que as regras não são válidas devido a outros fatores na camada de armazenamento.
EDIT Espero ter informações mais concretas para você. Só queria que você soubesse que é isso que o autor do livro Internals pensa atualmente. Ela não tem 100% de certeza.