Jag skulle säga pg_column_size
rapporterar den komprimerade storleken på TOAST
ed-värden, medan octet_length
rapporterar de okomprimerade storlekarna. Jag har inte verifierat detta genom att kontrollera funktionskällan eller definitionerna, men det skulle vara vettigt, särskilt som strängar av tal kommer att komprimeras ganska bra. Du använder EXTENDED
lagring så att värdena är kvalificerade för TOAST
kompression. Se TOAST
dokumentation
.
När det gäller att beräkna förväntad DB-storlek är det en helt ny fråga. Som du kan se från följande demo, beror det på saker som hur komprimerbara dina strängar är.
Här är en demonstration som visar hur octet_length
kan vara större än pg_column_size
, som visar var TOAST slår in. Låt oss först få resultaten på frågeutdata där ingen TOAST
spelar in:
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)
Låt oss nu lagra samma frågeutdata i en tabell och få storleken på de lagrade raderna:
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)