具有页面布局的表大小

KIM*_*KIM 3 postgresql storage database-design types

我在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)
Run Code Online (Sandbox Code Playgroud)

为什么tuple_len252而不是249?("所有列的最大长度的222字节"PLUS"元组头的27字节后跟可选的空位图,可选的对象ID字段和用户数据")

3个字节来自哪里?

我的配方有问题吗?

Erw*_*ter 5

你的计算在几点都没有.

  • 存储大小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 start
Run Code Online (Sandbox Code Playgroud)

- > 252个字节.

我写了一对夫妇的相关答案,你可以找到他们的联系到这一个(看看链接右侧列表).