J'ai vu cette question Bit vs colonnes booléennes .
Je me pose la même question pour Postgres: une colonne entière à un chiffre occupe-t-elle le même espace disque qu'une booléenne? Dans les grands tableaux (~ 50 colonnes x ~ 50 millions de lignes), lequel est le plus performant? Comment puis-je le savoir?
Vous pouvez connaître la taille de stockage avec
SELECT typname, typlen FROM pg_type WHERE typname IN ('bool', 'int4');
typname | typlen
---------+--------
bool | 1
int4 | 4
(2 rows)
Cependant, vous devez tenir compte de l'alignement :
SELECT typname, typlen, typalign FROM pg_type WHERE typname IN ('bool', 'int4');
typname | typlen | typalign
---------+--------+----------
bool | 1 | c
int4 | 4 | i
(2 rows)
c
est "caractère" (1 octet), tandis que i
est "entier".
Si vous définissez une table comme celle-ci:
CREATE TABLE a (
b boolean,
i integer
);
vous obtiendrez trois octets de "remplissage" inutilisés entre les colonnes, de sorte que l'entier puisse être stocké à une adresse divisible par 4.
Ainsi, le boolean
occuperait 4 plutôt que 1 octet de stockage.
Si vous spécifiez les colonnes dans l'autre sens, l'espace occupé par les données de chaque ligne ne serait que de 5 octets.
La ligne de table elle-même (le "Tuple") ne se compose pas seulement des données brutes, mais il existe un "en-tête de Tuple" de 23 octets pour chaque ligne (voir la documentation ). Il peut y avoir un remplissage après l'en-tête afin que les données de Tuple réelles soient alignées sur un multiple de MAXALIGN
(généralement 8).
Donc, si vous souhaitez optimiser votre table pour utiliser le moins de stockage possible, vous devez prendre en compte l'ordre des colonnes dans la table.