Sparse Columns é uma funcionalidade lançada no SQL Server 2008. Esta funcionalidade está presente nas versões: 2008, 2008 R2 e 2012.
Sparse Columns são colunas que têm um armazenamento otimizado para valores nulos. Elas reduzem o espaço nas colunas que possuem uma alta porcentagem de valores nulos. Usados corretamente, pode reduzir o tamanho das tabelas drasticamente e pode aumentar significativamente o desempenho delas em consultas nestas tabelas. Lembrando que o Sparse Columns não é um datatype, mas sim um gerenciamento do SQL Server para armazenar dados nulos.
Por exemplo, se uma coluna é do tipo char(12), mesmo nulo, ela irá utilizar 12 bytes. Mas, se é utilizado o SPARSE COLUMNS neste campo, o espaço de armazenamento será quase nada. O espaço necessário para valores nulos de outros tipos de dados varia um pouco.
Alguns tipos de dados não podem ser especificados como SPARSE:
geography, geometry, image, next, text, timestamp e user-defined data types
A desvatagem do Sparse Columns em valores não nulos em uma coluna SPARSE é um pouco maior do que uma coluna que não é declara como SPARSE. A vantagem de uma coluna SPARSE depende do tipo de dados e a porcentagem de linha para o tipo de dado. Para verificar a tabela com a porcentagem e os bytes liberados para cada tipo de dado clique neste link em Estimated Space Savings by Data Type.
Exemplo prático
Vamos criar uma tabela com uma coluna sem o SPARSE, logo após inserir registros na mesma e verificar qual o espaço em disco a tabela ocupa:
GO -- Cria a tabela sem o sparse CREATE TABLE tbNotSparse( id int identity(1,1) ,nome char(10) null ) GO -- Loop para inserir 10000 registros INSERT INTO tbNotSparse (nome) VALUES (null) GO 10000 GO -- Verifica o espaço em disco da tabela sp_spaceused 'tbNotSparse'
Veja o campo data. A tabela possui 264KB em disco:
Agora vamos realizar o mesmo passo anterior, porém a tabela estará com o parâmetro SPARSE em uma das colunas:
GO -- Cria a tabela com o sparse CREATE TABLE tbSparse( id int identity(1,1) ,nome char(10) sparse null -- parâmetro sparse na coluna ) GO -- Loop para inserir 10000 registros INSERT INTO tbSparse (nome) VALUES (null) GO 10000 GO -- Verifica o espaço em disco da tabela sp_spaceused 'tbSparse'
Agora veja o resultado:
A tabela ocupa apenas 136KB em disco. Uma diferença de 136 KB.
Eis um exemplo de como Sparse Columns é um bom recurso, mas lembrando sempre que é preciso realizar uma análise criteriosa antes de utilizar este recurso.