Sparse Columns – SQL Server

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:

notSparse

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:

sparse

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.

Deixe um comentário