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

Autor: 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 um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s