Je dirais pg_column_size
signale la taille compressée de TOAST
ed valeurs, tandis que octet_length
signale les tailles non compressées. Je n'ai pas vérifié cela en vérifiant la source de la fonction ou les définitions, mais cela aurait du sens, d'autant plus que les chaînes de nombres se compriment assez bien. Vous utilisez EXTENDED
stockage afin que les valeurs soient éligibles pour TOAST
compression. Voir le TOAST
documents
.
Quant au calcul de la taille de base de données attendue, c'est une toute nouvelle question. Comme vous pouvez le voir dans la démo suivante, cela dépend de choses comme la compressibilité de vos cordes.
Voici une démonstration montrant comment octet_length
peut être supérieur à pg_column_size
, démontrant où TOAST entre en jeu. Tout d'abord, obtenons les résultats sur la sortie de la requête où aucun TOAST
entre en jeu :
regress=> SELECT octet_length(repeat('1234567890',(2^n)::integer)), pg_column_size(repeat('1234567890',(2^n)::integer)) FROM generate_series(0,12) n;
octet_length | pg_column_size
--------------+----------------
10 | 14
20 | 24
40 | 44
80 | 84
160 | 164
320 | 324
640 | 644
1280 | 1284
2560 | 2564
5120 | 5124
10240 | 10244
20480 | 20484
40960 | 40964
(13 rows)
Stockons maintenant cette même sortie de requête dans une table et obtenons la taille des lignes stockées :
regress=> CREATE TABLE blah AS SELECT repeat('1234567890',(2^n)::integer) AS data FROM generate_series(0,12) n;
SELECT 13
regress=> SELECT octet_length(data), pg_column_size(data) FROM blah;
octet_length | pg_column_size
--------------+----------------
10 | 11
20 | 21
40 | 41
80 | 81
160 | 164
320 | 324
640 | 644
1280 | 1284
2560 | 51
5120 | 79
10240 | 138
20480 | 254
40960 | 488
(13 rows)