“Por que valores nulos ocupam espaço e como fazer para não ocupar?”
Primeiro, um valor nulo é um valor, não é a mesma coisa que um valor em branco.
Segundo, podemos otimizar o espaço utilizado pelas colunas de valores nulos utilizando a cláusula SPARSE, porém vale verificar se:
- quando utilizarmos sparse numa coluna e ela receber um valor esse irá receber um byte a mais;
- quando o valor for nulo, esse não irá ocupar espaço;
- se a coluna for de tamanho fixo ou precisão dependerá de quatro bytes a mais;
- se a coluna for de tamanho variável isso tomará dois bytes a mais.
Esse recurso não pode ser utilizado nas condições abaixo:
- colunas com as propriedades identity ou rowguidcol;
- colunas do tipo text, ntext, timestamp, geometry, geography ou em tipos definidos pelo usuário;
- varbinary(max) com a propriedade filestream;
- colunas computadas;
- colunas que sejam parte de um clustered index ou primary key.
Para fazer o teste criei duas tabelas com duas colunas, sendo que uma coluna de cada tabela aceita nulo e apenas a coluna da primeira tabela é criada com a opção sparse. Veja o script de criação abaixo:
CREATE table TesteE ( cdteste int PRIMARY KEY , nmteste char(200) SPARSE NULL) GO CREATE table TesteF ( cdteste int PRIMARY KEY , nmteste char(200) NULL)
Agora para inserir dados utilizei o SQL Data Generator da RedGate para gerar uma carga de 100 registros na primeira tabela, sendo que na coluna sparse marquei 50% de campos nulos.
Para a carga da segunda tabela, foi feita uma importação da primeira tabela, isso para ter certeza que a quantidade de bytes na coluna alvo da pesquisa seria a mesma quantidade que a da primeira tabela.
Depois de verificar que ambas as tabelas possuem o mesmo conteúdo, podemos validar o espaço ocupado por cada tabela.
Como podemos visualizar na imagem, podemos concluir que tivemos vantagem com a coluna SPARSE otimizando o espaço.
Entretanto, recomendo uma análise muito criteriosa antes de utilizar esse recurso.
Abraço, Rodrigo