Postgresql 表格大小与页面布局

Postgresql 表格大小与页面布局,postgresql,database-design,types,storage,Postgresql,Database Design,Types,Storage,我正在Oracle Linux Server 6.3版上使用PostgreSQL 9.2 根据,页面布局包含: PageHeaderData(24字节) n指向项(索引项/表项)的点数AKA ItemIdData(4字节) 自由空间 n项目数量 特殊空间 我对它进行了测试,以生成一些公式来估计预期的表大小…(TOAST的概念可能会被忽略) postgres=#\dt1; 表“public.t1” 列“,”类型“,”修饰符 ---------------+-------------------

我正在Oracle Linux Server 6.3版上使用PostgreSQL 9.2

根据,页面布局包含:

  • PageHeaderData(24字节)
  • n指向项(索引项/表项)的点数AKA ItemIdData(4字节)
  • 自由空间
  • n项目数量
  • 特殊空间
我对它进行了测试,以生成一些公式来估计预期的表大小…(TOAST的概念可能会被忽略)

postgres=#\dt1;
表“public.t1”
列“,”类型“,”修饰符
---------------+------------------------+------------------------------
代码|字符变化(8)|不为空
名称|字符变化(100)|不为空
act|yn|字符(1)|非空默认值“N”::bpchar
描述|字符变化(100)|不为空
组织代码1 |字符变化(3)|
组织机构2 |字符变化(10)|
postgres=#插入t1值(
'11111111', -- 8

“1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111”,您的计算在几个点上被关闭

  • varchar
    text
    (和
    character
    !)的存储大小为,):
短字符串(最多126字节)的存储要求为1字节 加上实际字符串,其中包括大小写中的空格填充 有个性。较长字符串的开销为4字节,而不是1字节。 长字符串由系统自动压缩,因此 对磁盘的物理要求可能会更低

在评论中用粗体强调我的问题

  • 这个。但每个元组(“项”-行或索引项)在数据页的开头有一个项标识符,总共有27个字节。这一区别是相关的,因为实际用户数据从每个项的开始处开始的倍数为
    maxallign
    ,项标识符不计入该偏移量以及实际的“元组大小”

  • 由于数据对齐而产生的1字节填充(8的倍数),在本例中用于空位图

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

因此,实际计算(所有列填充到最大值)为:

23--heaptupleheader
+1—空位图(如果行没有空值,则填充)
+9--列。。。
+ 101 
+   2 
+ 101 
+   4 
+  11
-------------
252字节
+4--页面开始处的项目标识符
相关的:


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

对齐填充?我还没有详细查看它。文档可能有HeapTupleHeader大小的问题。我将其编辑为27。对于那些想知道:函数
pgstattuple(text)
是由附加模块提供的。
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)
    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