On Tue, Apr 2, 2013 at 10:36 AM, Alexsander Rosa
<[email protected]>wrote:

> > Entendo que a diferença seria apenas de espaço em disco mesmo. Use
> varchar e boa.
>
> Strings de até 126 bytes têm 1 byte de overhead (para o tamanho da
> String); strings maiores têm 4 bytes de overhead.
> Não seria um ganho de velocidade se o PostgreSQL armazenasse strings de 2,
> 4 e 8 bytes em tipos unsigned?
> Sei que existe o tipo "char" (com aspas) que fica armazenado em exatamente
> 1 byte.
>

Hmm... não é assim que funciona.

Todos os tipos de tamanho variável (inclua aí o char e deixe o toast fora
disso – já explico) compartilham uma mesma estrutura chamada varlena. Este
é o cabeçalho padrão para bytea, bpchar (vulgo char), cstrings, &ca e
possui a seguinte definição:

estrutura Varlena
  v_len[4] -- informações sobre o tamanho do dado armazenado;
  v_dat[1] -- Início do array de armazenamento;

Este tipo de estrutura é muito utilizado como um /pattern/ e basicamente
possibilita a extensibilidade de tipos, funcionalidade que seria inviável
com tipos unsigned – se não me engano v_len já foi inteiro num belo dia.
Tentei fazer o diff com tags antigos no git mas me perdi :-\

Quando vc cria um tipo de dados com restrição de comprimento, vc habilita
no catálogo o armazenamento com atttypmod ( > 0 – ver
pg_attribute.atttypmod). Este mesmo atributo é utilizado para operações de
validações com a constante VLHDRSIZE (depois confirmo este nome) que é o
tamanho do header da estrutura varlena.

Esta arquitetura é histórica e existe desde dos primórdios do elefante e a
mudança certamente exigiria uma refatoração inclusive conceitual da coisa
toda.

O "char" com aspas pra mim é novidade....

Abraço!

-Leo
-- 
Leonardo Cezar
http://www.postgreslogia <http://postgreslogia.wordpress.com>.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a