Postgresql 表格大小与页面布局
我正在Oracle Linux Server 6.3版上使用PostgreSQL 9.2 根据,页面布局包含: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” 列“,”类型“,”修饰符 ---------------+-------------------
- PageHeaderData(24字节)
- n指向项(索引项/表项)的点数AKA ItemIdData(4字节)
- 自由空间
- n项目数量
- 特殊空间
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