我在 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
252 而不是 249?(“所有列的最大长度的 222 字节”加上“27 字节的元组标头,后跟可选的空位图、可选的对象 ID 字段和用户数据”)
3 个字节从何而来?
我的公式有问题吗?