Quelle est la différence entre le type smallint
et le type bool
pour stocker des valeurs booléennes?
Cette question se pose dans les commentaires à ne question sur l'échange de piles de systèmes d'information géographique.
TOUJOURS stocker des données booléennes comme boolean
. Seule exception exotique imaginable.
Juste pour résoudre le stockage Angle en plus de ce que vous avez posté comme réponse:
boolean
nécessite 1 octet sur disque, smallint
nécessite 2. Mais ce n'est pas toute l'histoire.
smallint
(comme d'autres types d'entiers et contrairement à boolean
) a également des besoins particuliers pour Rembourrage d'alignement . Il ne peut que commencer à un décalage même à partir du début des données TUPLE. Donc, un autre octet est consommé chaque fois impair (littéralement).
Dans un pire scénario, lors du mélange avec des types nécessitant un alignement de 8 octets comme bigint
ou timestamp
/timestamptz
:
SELECT pg_column_size(row("char" 'a', FALSE )) AS char_bool
, pg_column_size(row("char" 'a', int2 '1')) AS char_int2
, pg_column_size(row(text 'abcdef', TRUE , now())) AS text7_bool_ts
, pg_column_size(row(text 'abcdef', int2 '1', now())) AS text7_int2_ts; -- worst case
char_bool | char_int2 | text7_bool_ts | text7_int2_ts
-----------+-----------+---------------+---------------
26 | 28 | 40 | 48
Détails:
Si vous avez Beaucoupboolean NOT NULL
valeurs et souhaitez optimiser l'espace sur le disque: