2012-11-09 21 views
7

私は、列の型と長さのサイズを参照して、予想されるテーブルサイズを取得しています。私はこのためにpg_column_sizeを使用しようとしています。pg_column_sizeはどのようにoctet_lengthよりも小さくすることができますか?

この関数をテストすると、この関数で何かが間違っているように見えました。

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) 

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

答えて

12

TOAST ed値の圧縮サイズを報告していますが、octet_lengthは圧縮されていないサイズを報告しています。私は関数のソースや定義を調べることでこれを検証していませんが、数字の文字列がかなりよく圧縮されるため、意味があります。 EXTENDEDストレージを使用しているため、値はTOAST圧縮に適格です。 the TOAST documentationを参照してください。

予想されるDBサイズを計算するには、全く新しい質問です。次のデモからわかるように、あなたの弦がどのように圧縮可能であるかのようなものに依存します。

はここoctet_lengthがでどこTOASTキックを実証し、pg_column_sizeよりも大きくすることができますどのように示すデモの最初の、何の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) 
+0

ありがとうございます... – KIM

関連する問題