KIM*_*KIM 3 postgresql storage database-design types
我在Oracle Linux Server 6.3版上使用PostgreSQL 9.2.
根据存储布局文档,页面布局包含:
我测试它以制作一些公式来估计预期的表格大小......(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)
Run Code Online (Sandbox Code Playgroud)
为什么tuple_len252而不是249?("所有列的最大长度的222字节"PLUS"元组头的27字节后跟可选的空位图,可选的对象ID字段和用户数据")
3个字节来自哪里?
我的配方有问题吗?
你的计算在几点都没有.
varchar或是text(引用此处的手册):短字符串(最多126个字节)的存储要求是1个字节加上实际字符串,其中包括字符空间填充.较长的字符串有4个字节的开销而不是1.长字符串由系统自动压缩,因此磁盘上的物理要求可能更少.
大胆强调我的评论中的问题.
该HeapTupeHeader占用23个字节,而不是27个字节.
由于数据对齐而导致的1字节填充(8的倍数),在这种情况下用于NULL位掩码.
没有填充类型character.
所以,实际的计算是:
23 -- heaptupleheader
+ 1 -- NULL bitmap (or padding if row has NO null values)
+ 9 -- columns ...
+ 101
+ 2
+ 101
+ 4
+ 11
-------------
252 bytes
+ 4 -- item identifier at page startRun Code Online (Sandbox Code Playgroud)
- > 252个字节.
我写了一对夫妇的相关答案,你可以找到他们的联系到这一个(看看链接右侧列表).