Sparse Columns

“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

Deixe uma resposta

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.