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

Author: SQLCrespi

Rodrigo Crespi é MVP Data Platform, MCT, MCSE, MCSA, MCIT, MCDBA e MCP em SQL Server, possuí outras certificações em .NET Framework, Dynamics CRM e etc. Iniciou trabalhando com SQL Server na versão 6.5 na época como desenvolvedor, logo direcionou a sua carreira para a área de administração de bancos de dados. Atualmente é Sócio da CrespiDB – Soluções em Plataformas de Dados, além de professor universitário na Uniftec – Caxias do Sul Autor de diversos artigos publicados em sites e revistas sobre SQL Server e engenharia de software, mantem o canal SQLCrespi no Youtube, o blog SQLCrespi, além de ser dedicado ao SQL Server RS PASS Chapter Leader do grupo de profissionais em SQL Server do Rio Grande do Sul.

Deixe uma resposta