Oracle Linux Server リリース 6.3 で PostgreSQL 9.2 を使用しています。
ストレージ レイアウトのドキュメントによると、ページ レイアウトには以下が保持されます。
- PageHeaderData(24バイト)
- n アイテムへのポイント数(インデックスアイテム/テーブルアイテム) AKA ItemIdData(4バイト)
- フリースペース
- n 個のアイテム
- 特別な空間
予想されるテーブルサイズを見積もる式を作成するためにテストしました...(TOASTの概念は無視される可能性があります。)
postgres=# \d t1;
Table "public.t1"
Column ',' Type ',' Modifiers
---------------+------------------------+------------------------------
code |character varying(8) |not null
name |character varying(100) |not null
act_yn |character(1) |not null default 'N'::bpchar
desc |character varying(100) |not null
org_code1 |character varying(3) |
org_cole2 |character varying(10) |
postgres=# insert into t1 values(
'11111111', -- 8
'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111', <-- 100
'Y',
'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111', <-- 100
'111',
'1111111111');
postgres=# select * from pgstattuple('t1');
table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
8192 | 1 | 252 | 3.08 | 1 | 252 | 3.08 | 7644 | 93.31
(1 row)
なぜtuple_len
249 ではなく 252 なのですか? (「すべての列の最大長の 222 バイト」に加えて、「オプションのヌル ビットマップ、オプションのオブジェクト ID フィールド、およびユーザー データが続く 27 バイトのタプル ヘッダー」)
3バイトはどこから来たのですか?
私の式に何か問題がありますか?