Sql postgres表中元数据的大小是多少?
postgres 9.4中有一个表,其中包含以下类型的列:Sql postgres表中元数据的大小是多少?,sql,postgresql,memory,Sql,Postgresql,Memory,postgres 9.4中有一个表,其中包含以下类型的列: NAME TYPE TYPE SIZE id | integer | 4 bytes timestamp | timestamp with time zone | 8 bytes num_seconds
NAME TYPE TYPE SIZE
id | integer | 4 bytes
timestamp | timestamp with time zone | 8 bytes
num_seconds | double precision | 8 bytes
count | integer | 4 bytes
total | double precision | 8 bytes
min | double precision | 8 bytes
max | double precision | 8 bytes
local_counter | integer | 4 bytes
global_counter | integer | 4 bytes
discrete_value | integer | 4 bytes
总计:60字节/行
pg\u table\u size(table)
返回的表(带toast)的大小为:49 152字节
表中的行数:
97
考虑到一个表被拆分为8kB
的页面,我们可以将49152/8192=6个页面
放入这个表中
每一页和每一行都有一些。。。
从纯数据类型大小来看,我们应该期望行数据的大小大约为97*60=5820字节
,并向其中添加大致相同数量的元数据,我们甚至没有接近pg_table_size
返回的结果:49 152字节
与postgres中的纯数据相比,元数据真的占用了约9倍的空间吗?因子9显然比应该占用的空间更多(“膨胀”):
- 每个页面都有一个16字节的标题
- 每行有一个23字节的“元组头”
- 由于对齐原因,
和id
之间以及timestamp
和count
之间将有四个字节的填充(您可以通过对列重新排序来避免)total
- 此外,每个元组在数据页中有两个字节的“行指针”
pgstattuple
扩展:
CREATE EXTENSION pgstattuple;
并使用表中的pgstattuple
功能:
SELECT * FROM pgstattuple('tablename');
运行
真空吸尘器充满_表后会得到什么代码>?现在是16384字节
。考虑到从未从表中删除任何内容,这是一个巨大的真空清理结果,而且由于锁定,在使用数据库时,我无法真空填充数据库。计算磁盘上的千字节有什么意义?生成一百万行,然后查看使用情况。如果您在非常有限的环境中工作,那么Pg可能不是正确的选择…膨胀不仅是由删除引起的,而且也是由更新引起的-特别是如果您有长时间运行的事务,并且autovacuum无法处理旧的行“考虑到从未从表中删除任何内容,这是一个巨大的真空清理结果,而且由于锁定,在使用数据库时,我无法将其完全真空“我以为你的目标是理解。你真的担心32kB是一个实用的问题吗?如上所述,在清空后,大小从49kB下降到16kB。我不知道“真空满”(vacuum full)是怎么做的,但我唯一怀疑的可能是,我们在一小时开始时插入了几个条目,在这一小时内,我们每分钟更新一次,这些更新留下了垃圾。对,大量的更新将导致膨胀。