De acordo com os links abaixo, NULL
os valores ocupam algum espaço de armazenamento:
https://stackoverflow.com/questions/3731172/how-much-size-null-value-takes-in-sql-server
https://www.sqlservercentral.com/forums/topic/null-storage-2
Se a coluna tiver o tipo de dados de largura fixa - NULL
ocupa o comprimento da coluna
char(10) NULL takes 10 bytes
INT NULL takes 4 bytes
Se a coluna tiver largura variável - NULL
leva 0 bytes
varchar(1000) NULL takes 0 bytes (+ 2 bytes of varchar column overhead ?)
Além disso, há uma sobrecarga por ter uma coluna anulável. As informações nos links são um pouco contraditórias.
Alguém pode dar uma luz sobre isso?
Aqui estão minhas perguntas:
Algumas pessoas dizem que a sobrecarga por ter uma coluna anulável é de 1 bit por linha, outras que é de 1 byte por linha
. Qual é verdade? Eu suponho que seja 1 bit por linha (portanto, 8 linhas fazem 1 byte), estou certo?Para valores NULL em varchar, ainda há uma sobrecarga de 2 bytes por linha - é realmente verdade?
Pergunta mais importante:
eu tenho uma tabela com ~ 250 milhões de linhas de dados, o tamanho total é ~ 115 GB
Eu adicionei 7 colunas usando o código abaixo, verificando o tamanho da tabela usando sp_spaceused após cada comando
colunas adicionadas:
alter table MyTable add TestVarchar10 varchar(10) NULL
alter table MyTable add TestVarchar1000 varchar(1000) NULL
alter table MyTable add TestVarchar10DefaultTest varchar(10) NULL default 'test'
alter table MyTable add TestVarchar10DefaultTestWithValues varchar(10) NULL default 'test' with values
alter table MyTable add TestINT int NULL
alter table MyTable add TestINTDefault99 int NULL default 99
alter table MyTable add TestINTDefault99WithValues int NULL default 99 with values
E qualquer uma das colunas adicionais, não aumentou o tamanho da tabela
Como pode ser isso? Eu esperaria que o tamanho da tabela mudasse à medida que o NULL
armazenamento ocupasse espaço
O bitmap nulo é armazenado no nível da linha, portanto, é necessário 1 byte para cada 8 colunas de cada linha. A sobrecarga é incorrida para cada linha, independentemente de a coluna ser definida como anulável ou não (desde o SQL 2000).
O deslocamento de coluna é armazenado para colunas de comprimento variável NULL, exceto para a(s) última(s), de modo que valores NULL em comprimento variável podem incorrer em uma sobrecarga de 2 bytes, dependendo da posição.
É aqui que fica interessante. O SQL Server Enterprise Edition (ou Developer Edition) inclui otimizações de forma que algumas modificações de esquema sejam apenas operações de metadados. Se você executar o mesmo teste na edição Standard ou Express, o espaço dobrará.
Veja o post de blog Anatomia de um registro de Paul Randal . Embora antiga, a maioria ainda se aplica à versão atual do SQL Server, incluindo o Banco de Dados SQL do Azure.