pg_column_sizeと言います TOASTの圧縮サイズを報告しています ed値、octet_length 圧縮されていないサイズを報告しています。関数のソースや定義をチェックしてこれを確認していませんが、特に数値の文字列が非常によく圧縮されるため、これは理にかなっています。 EXTENDEDを使用しています 値がTOASTの対象となるようにストレージ 圧縮。 TOASTを参照してください ドキュメント
。
予想されるDBサイズの計算に関しては、まったく新しい質問です。次のデモからわかるように、文字列の圧縮性などによって異なります。
これは、octet_lengthがどのように行われるかを示すデモです。 pg_column_sizeより大きくすることができます 、TOASTが開始される場所を示します。最初に、TOASTがないクエリ出力で結果を取得しましょう。 登場:
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)
次に、同じクエリ出力をテーブルに格納し、格納されている行のサイズを取得しましょう。
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)