14

列のタイプと長さのサイズを参照して、予想されるテーブルサイズを取得することを探しています。私はpg_column_sizeこれに使用しようとしています。

関数をテストしたところ、この関数に何か問題があるように思われることに気づきました。

からの結果値は、同じ文字列のpg_column_size(...)からの戻り値よりも小さい場合があります。octet_length(...)

列には数字しかありません。

postgres=# \d+ t5
                           Table "public.t5"
 Column |       Type        | Modifiers | Storage  | Stats target | Description 
--------+-------------------+-----------+----------+--------------+-------------
 c1     | character varying |           | extended |              | 
Has OIDs: no

postgres=# select pg_column_size(c1), octet_length(c1) as octet from t5;
 pg_column_size | octet 
----------------+-------
              2 |     1
            704 |   700
            101 |  7000
            903 | 77000
(4 rows)

これはバグか何かですか?列の種類とその長さの値から予想されるテーブルサイズを計算するための数式を持っている人はいますか?

4

1 に答える 1

20

圧縮されていないサイズを報告している間、ed値pg_column_sizeの圧縮されたサイズを報告していると思います。関数のソースや定義をチェックしてこれを確認したことはありませんが、特に数値の文字列が非常によく圧縮されるため、理にかなっています。ストレージを使用しているため、値は圧縮の対象となります。ドキュメントを参照してください。TOASToctet_lengthEXTENDEDTOASTTOAST

予想される DB サイズの計算に関しては、まったく新しい問題です。次のデモからわかるように、文字列の圧縮率などに依存します。

これは、 TOAST がどこで機能octet_lengthするかを示すデモンストレーションです。まず、noが機能する場合のクエリ出力の結果を取得しましょう。pg_column_sizeTOAST

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)
于 2012-11-09T08:37:36.310 に答える