PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment pg_column_size peut-il être inférieur à octet_length ?

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)