2012-11-23 84 views
3

我在Oracle Linux Server版本6.3上使用PostgreSQL 9.2。使用页面布局的表大小

根据the storage layout documentation,页面布局成立:

  • 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字节”PLUS “27字节的元组头,后面跟着可选的空位图,可选的对象ID字段和用户数据”)3个字节从哪里来?

我的配方有什么问题吗?

+0

对齐填充?我没有查看详细信息。 –

+0

DOCS可能与HeapTupleHeader的大小有关。我将它编辑为27. – KIM

+0

对于那些想知道:函数'pgstattuple(text)'由附加模块[pgstattuple]提供(http://www.postgresql.org/docs/current/interactive/pgstattuple.html) 。 –

回答

5

您的计算关闭了几个点。

    varchartext
  • 存储大小为(引用手动here):

在短字符串(最多126个字节)的存储要求是1字节 加上实际的串,其中包含字符 的空格填充。较长的字符串具有4字节的开销而不是1. 长字符串被系统自动压缩,因此磁盘上的物理需求可能会更少。

大胆强调我的意见,以解决问题。

  • HeapTupeHeader occupies 23 bytes,不是27字节。

  • 由于数据对齐(8的倍数)而导致的1个字节的填充字,在此情况下用于NULL位掩码。

  • 没有填充类型varchar

所以,实际的计算公式是:

 23 -- heaptupleheader 
    + 1 -- NULL bit mask (or padding if all columns are NOT NULL) 
    + 8 -- columns 
    + 100 
    + 1 
    + 100 
    + 3 
    + 10 
    + 6 -- 1 byte overhead per varchar column, 6 columns 

- > 字节。

我写了几个相关的答案,你可以找到他们大多数链接到this one(看右边的链接列表)。

+0

非常感谢你... – KIM