De acordo com https://www.postgresql.org/docs/current/datatype-enum.html
Um valor enum ocupa quatro bytes no disco.
Esta parece uma escolha estranha. É claro que os rótulos enum são mapeados para números inteiros de tamanho fixo para aumentar a velocidade, mas por que 4 bytes?
Na maioria das vezes, enums são usados apenas para algumas opções; 1 byte seria suficiente.
É compreensível que os designers queiram atender a enumerações ocasionais maiores. Qual é o maior enum já visto na natureza? Posso imaginar um sendo usado, por exemplo, para o código do país. São 249 na última contagem; apenas mais alguns países ultrapassariam 1 byte. Posso ver a razão para torná-lo 2 bytes.
Mas por que 4? Alguém já usou um enum de banco de dados com mais de 65.536 casos? O Postgres realmente funciona com tantos?
Nos bastidores, um valor enum é a
real
, não aninteger
, e é por isso que ocupa quatro bytes. Veja o catálogo do sistema:enumtypid
é o OID do tipo de dados (depg_type
),enumsortorder
é o valor real armazenado na tabela eenumlabel
é o rótulo.Para entender por que
real
é usado, veja este exemplo:Até agora, isso não é muito surpreendente.
Isso também está bem claro.
Ah! Desde então
'millionaire' < 'billionaire'
, sua ordem de classificação deve estar entre'rich'
e'billionaire'
. Com uminteger
, teríamos que alterar a ordem de classificação'billionaire'
para 4 para abrir espaço para o novo rótulo. Mas isso é impossível, porque o valor interno de 3 pode já estar armazenado em alguma tabela em algum lugar, e certamente não podemos sair por aí reescrevendo todas essas tabelas.A resposta óbvia é usar um valor de ponto flutuante, para que possamos interpolar novos valores entre os existentes.
Temos que "desperdiçar" quatro bytes, porque não existe um tipo de dados de ponto flutuante mais curto. Se você considerar que cada linha da tabela tem uma sobrecarga de 23 bytes e que muitos dos três bytes que você gostaria de salvar podem ser perdidos devido ao preenchimento causado por requisitos de alinhamento, você verá que o desperdício não é tão ruim assim.