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