web-dev-qa-db-fra.com

Utilisation du disque de la colonne entière par rapport à la colonne booléenne dans Postgres

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?

6
Sotis

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.

11
Laurenz Albe