【问题标题】:Table size with page layout表格大小与页面布局
【发布时间】:2012-11-23 06:39:21
【问题描述】:

我在 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 字节”加上 “27 字节的元组标头,后跟可选的空位图、可选的对象 ID 字段和用户数据”)

这 3 个字节从何而来?

我的公式有问题吗?

【问题讨论】:

  • 对齐填充?没仔细看。
  • DOCS 的 HeapTupleHeader 大小可能存在问题。我将其编辑为 27。
  • 对于那些想知道的人:函数pgstattuple(text)由附加模块pgstattuple提供。

标签: postgresql database-design types storage


【解决方案1】:

你的计算在几个点上是错误的。

短字符串(最多 126 个字节)的存储要求为 1 个字节 加上实际的字符串,其中包括案例中的空格填充 性格的。较长的字符串有 4 个字节的开销,而不是 1 个。 长字符串由系统自动压缩,所以 对磁盘的物理要求可能会更少。

我的粗体强调以解决评论中的问题。

  • HeapTupleHeader occupies 23 bytes。但是每个元组(“item” - 行或索引条目)在数据页的开头都有一个 item identifier,总共有提到的 27 个字节。区别是相关的,因为实际用户数据从每个项目的开头以 MAXALIGN 的倍数开始,并且项目标识符不计入此偏移量 - 以及实际的“元组大小”。

    李>
  • 由于数据对齐(8的倍数)导致的1字节填充,在这种情况下用于NULL位图。

  • varchar 类型没有填充(但上面提到的附加字节)

所以,实际计算(所有列都填到最大值)是:

    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

相关:

您会在这些答案右侧的链接列表中找到更多内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2013-04-24
    • 1970-01-01
    • 2021-12-21
    • 2016-04-28
    • 2021-01-02
    相关资源
    最近更新 更多