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'

sp_spaceused

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:

  1. Armazenar os dados usando tipos de dado com tamanho variável (Ex: VARCHAR)
  2. 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, Fabricio

  • Anonymous
    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.
  1. SPARSE muda o comportamento de NULL ou NOT NULL em relação ao espaço utilizado
  2. 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