3

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

3 个字节从何而来?

我的公式有问题吗?

4

1 回答 1

5

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

  • varchartext(和character!)的存储大小是,引用手册):

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

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

  • HeapTupleHeader 占用23个字节。但是每个元组(“项目” - 行或索引条目)在数据页的开头都有一个项目标识符,总计为上述 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

有关的:

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

于 2012-11-23T09:16:54.857 回答