Loading…

Colunas com valores NULL ocupam espaço em disco? Mito?

Olá Pessoal,

Muitos de vocês já devem ter recebido a seguinte solicitação: “Favor criar uma coluna nova na tabela X (80 milhões de linhas). Como os valores existentes serão NULLs, esse campo não ocupará espaço em disco e não teremos nenhum impacto nessa tabela“.

Entretanto, não é exatamente isso que acontece!

Tipos de dados que possuem um tamanho fixo ocupam espaço em disco mesmo sendo NULL. Ex: Int, bigint, char, datetime e etc..

Tipos de dados que possuem um tamanho variável, não ocupam espaço em disco quando NULL . Ex: Varchar(100). Com exceção dos 2 bytes que o tipo varchar já ocupa inicialmente.

Você pode verificar isso criando duas tabelas com as mesmas colunas, mas inserindo somente valores NULLs em uma tabela e somente valores não NULLs em outra tabela:

create table Teste_NULL(
Id int identity(1,1),
TesteInt int NULL,
TesteData datetime,
TesteChar char(10),
TesteNumeric numeric(15,2),
constraint PK_Teste_NULL primary key (Id))

create table Teste_NOTNULL(
Id int identity(1,1),
TesteInt int NOT NULL,
TesteData datetime NOT NULL,
TesteChar char(10) NOT NULL,
TesteNumeric numeric(15,2) NOT NULL,
constraint PK_Teste_NOTNULL primary key(Id))

SET NOCOUNT ON
— Fiz um loop para funcionar em qualquer versão do SQL Server
declare @loop int
set @loop= 1
while @loop<= 20000
begin
insert into Teste_NULL
select null,null,null,null

insert into Teste_NOTNULL
select @loop,getdate(),’1234567890′, 9999999999999.99
set @loop= @loop + 1
end

exec sp_spaceused Teste_NULL
exec sp_spaceused Teste_NOTNULL

Essa query acima gera o resultado:

Conforme pode ser visto, as duas tabelas possuem 20.000 linhas e ocupam o mesmo espaço em disco. Logo, está provado que colunas com valores NULL também ocupam espaço em disco.

Entretanto, ao adicionarmos um campo em uma tabela existente, o sql server não aumenta o espaço em disco ocupado por essa tabela.

Visualizando:

ALTER TABLE Teste_NULL
Add Novacoluna datetime NULL

Conferindo o tamanho da tabela Teste_NULL, podemos verificar que o mesmo não foi alterado:

Então isso é uma exceção e o SQL Server não ocupa espaço em disco quando criamos esse campo???

Não é bem assim. O SQL Server cria o seu novo campo apenas nos metadados, mas ele não percorre todas as páginas de dados alterando o tamanho das linhas da tabela para a inclusão desse novo campo. Como nós criamos campos no meio do dia (em zero segundos), essa operação seria muito custosa de ser realizada.

Contudo, ao realizarmos um REBUILD do índice clustered dessa tabela, o SQL Server recria as páginas de dados dessa tabela e nesse momento ele já deixa um espaço reservado para essa nova coluna. Agora, sua coluna com valores NULL passa a ocupar espaço em disco novamente.

Visualizando:

ALTER INDEX PK_Teste_NULL on Teste_NULL REBUILD

Como podem perceber, agora a nova coluna do tipo datetime e com valores somente NULL passou a ocupar espaço em disco.

Espero que tenha ajudado a esclarecer esse mito que é comum de ouvirmos no nosso dia a dia.

Gostou desse Post?

Cadastre seu e-mail para receber novos Posts e curta minha Página no Facebook para receber Dicas de Leituras e Eventos sobre SQL Server.

Abraços,

Fabrício Lima

MCITP – Database Administrator

Consultor e Instrutor SQL Server

Trabalha com SQL Server desde 2006

7 thoughts on “Colunas com valores NULL ocupam espaço em disco? Mito?

Deixe uma resposta