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