NULL or NOT NULL: Qual a diferença?
A idéia começou a partir de um comentário gerado no post Data Buffer, quando o DBA SQL sugeriu a utilização do DBCC PAGE para visualizar os registros dentro de um buffer – enfim, ele queria ver os bits & bytes do SQL Server. Isso me lembrou uma pergunta bastante interessante sobre o comportamento do banco de dados:
Qual a diferença em termos de espaço em disco de usar NULL ou NOT NULL? É possível economizar espaço?
Vamos ao experimento!
Criamos duas tabelas A e B, cuja única diferença é o campo coluna ser NULL ou NOT NULL. Segue a definição:
CREATE TABLE A( coluna CHAR(100) NULL )
CREATE TABLE A( coluna CHAR(100) NOT NULL )
Em seguida, populamos a tabela com uma série de registros.
INSERT A VALUES (NULL)
GO 1000
INSERT B VALUES ('ABCDEF')
GO 1000
Ambas as tabelas utilizam campos CHAR(100), mas populamos a tabela A com 1000 registros nulos, enquanto que a tabela B possui 1000 registros ‘ABCDEF’.
Qual ocupa mais espaço em disco?
Medimos o espaço utilizado em disco através da stored procedure sp_spaceused.
EXEC sp_spaceused'A'
EXEC sp_spaceused 'B'
Uau! As tabelas apresentam o mesmo espaço em disco! Seria isso uma surpresa?
Moral da história
A diferença de NULL e NOT NULL não faz diferença em economia de espaço para tipos de dados de tamanho fixo. Isso inclui CHAR, INTEGER, DATETIME, FLOAT, entre outros.
Existe duas formas de economizar espaço:
- Armazenar os dados usando tipos de dado com tamanho variável (Ex: VARCHAR)
- Habilitar o ROW/PAGE COMPRESSION na tabela
Comments
Anonymous
October 27, 2010
To começando agora um curso Gestor de T.i, na concepção de preenchimento a Tab 2, precisa obrigatoriamente ser prenchida com algum dado?Anonymous
October 27, 2010
Olá Edcarlos! Essa é uma pergunta de modelagem. Em geral, as tabelas contém informações inter-relacionadas e, por isso, é importante preencher com dados - são raros os casos que são necessárias tabelas vazias. Isso responde? Continue mandando suas perguntas! Abraços, FabricioAnonymous
October 27, 2010
Valeu pela resposta, Como disse to começando agora, vc me indicaria algum material especifico. To vendo a materia Introdução ao Banco de Dados.Anonymous
October 27, 2010
Boa Ninja, Mas Opa, e o Sparse? Abraços...Anonymous
March 04, 2011
Fiz uma brincadeira aqui com os exemplos do Fabricio, criando duas outras tabelas iguais com o SPARSE, e veja o resultado: name rows reserved data index_size unused
C 1000 24 KB 16 KB 8 KB 0 KB name rows reserved data index_size unused
D 1000 136 KB 128 KB 8 KB 0 KB Moral da História: Campo char com SPARSE e a maioria dos campos NULL o ganho de espaço é fantástico, o resultado é como se fosse VARCHAR. Com a maioria dos registros preenchidos, haverá um aumento do espaço utilizado (128Kb). :-(
- Anonymous
March 04, 2011
Agora que li sua pergunta Fabiano, mas o Roberto já respondeu.
- SPARSE muda o comportamento de NULL ou NOT NULL em relação ao espaço utilizado
- SPARSE deve ser usado quando a maioria das colunas é NULL A funcionalidade foi pensada para os casos no qual a tabela possui centenas de colunas, na qual a maioria é nula. Abraços, Fabricio