Em SQL server, quanto ocupa um bit?

Surgiu uma questão interessante durante uma conversa.

Resumindo, a dada altura eu disse que o bit estava a ocupar um byte.

Alguém: “O bit está a ocupar um bit.”
Eu: “Sim, mas esse bit está a ocupar um byte. Dois bits estão a ocupar um byte.”
Alguém: “Mas é só um bit.”
Eu: “Sim, mas 8 bits ocupam um byte, 9 bits ocupam 2 bytes.”
Alguém: “Não sabia.”

Acredito que isto ainda passe despercebido a alguns de nós.


Já agora, a partir de hoje as demos já estão a correr em SQL 2019, que já saiu oficialmente.
Se não existir informação em contrário a compatibilidade é 150.


Começamos com uma simples tabela.

CREATE TABLE [dbo].[BitTest](
	[col1] [bigint] IDENTITY(1,1) NOT NULL,
	[col2] [bit] NOT NULL,
	[col3] [bigint] NOT NULL,
) ON [PRIMARY]
GO

Agora vamos ver o que acabámos de criar.

select p.index_id, p.partition_number, 
	pc.leaf_null_bit,
	coalesce(cx.name, c.name) as column_name,
	pc.partition_column_id,
	pc.max_inrow_length,
	pc.max_length,
	pc.key_ordinal,
	pc.leaf_offset,
	pc.is_nullable,
	pc.is_dropped,
	pc.is_uniqueifier
from sys.system_internals_partitions p
join sys.system_internals_partition_columns pc
	on p.partition_id = pc.partition_id
left join sys.index_columns ic
	on p.object_id = ic.object_id
	and ic.index_id = p.index_id
	and ic.index_column_id = pc.partition_column_id
left join sys.columns c
	on p.object_id = c.object_id
	and ic.column_id = c.column_id	
left join sys.columns cx
	on p.object_id = cx.object_id	
	and p.index_id in (0,1)
	and pc.partition_column_id = cx.column_id
where p.object_id = object_id('BitTest')
order by index_id, partition_number

O Offset do nosso bit (a col2) está no 12, com 1 de tamanho.
Em bytes!
A col3 começa no offset 13, como esperado.

Vamos adicionar uma coluna? Já agora, outro bit?

alter table [dbo].[BitTest]
add col4 bit not null

Repetindo aquele código de cima para vermos as alterações na tabela…

Como esperado, pelo menos para mim, a nova col4 fica no offset 12, juntinho ao outro bit.

E se adiconarmos mais 7 bits para termos um total de 9?

alter table [dbo].[BitTest]
add 
col5 bit not null,
col6 bit not null,
col7 bit not null,
col8 bit not null,
col9 bit not null,
col10 bit not null,
col11 bit not null

Se fizermos as contas, temos 8 colunas no offset 12 e a última inserida (col11) no offset 21.
A col3 está no offset 13 e ocupa 8 bytes, o próximo byte disponível é 13+8 = 21, exactamente onde vamos encontrar a nona coluna bit desta tabela.

Resumindo:

Um bit ocupa um byte.
Dois bits ocupam um byte.
Oito bits ocupam um byte.
Nove bits ocupam dois bytes.

E assim sucessivamente….

Share

You may also like...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *