web-dev-qa-db-fra.com

Utilisation de PostgreSQL Quelle est la différence entre un Smallint et un Bool pour stocker Boolean?

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.

5
Evan Carroll

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:

14
Erwin Brandstetter