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