NULL or NOT NULL: Qual a diferença?

NULL or NOT NULL: Qual a diferença?

  • Comments 6

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
  • 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?

  • 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

  • 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.

  • Boa Ninja,

    Mas Opa, e o Sparse?

    Abraços...

  • 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). :-(

  • 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

Page 1 of 1 (6 items)
Leave a Comment
  • Please add 8 and 5 and type the answer here:
  • Post