我打算在一张只有2个字段的表中存储记录:
id -> 4个字符
password_hash -> 64个字符
在Heroku上的5mb PostgreSQL数据库中,我最多能存储多少个像上面那样的记录?
P.S.: 给定一个包含x列和长度为y的单个表 - 我如何计算它在数据库中所需的空间?
我打算在一张只有2个字段的表中存储记录:
id -> 4个字符
password_hash -> 64个字符
在Heroku上的5mb PostgreSQL数据库中,我最多能存储多少个像上面那样的记录?
P.S.: 给定一个包含x列和长度为y的单个表 - 我如何计算它在数据库中所需的空间?
计算磁盘空间并不容易。你需要考虑到以下因素:
每张表的开销。这些基本上是系统目录中的项。
每行的开销(HeapTupleHeader
)和每个数据页的开销(PageHeaderData
)。有关页面布局的详细信息请参阅手册。
由数据类型决定的,因列对齐而丢失的空间。
NULL 位图所占用的空间。对于少于8列的表来说,实际上是免费的,与您的情况无关。
UPDATE
/ DELETE
后的死行。(直到空间最终被清理并重复利用。)
索引(es) 的大小。你会有一个主键,对吧?索引的大小类似于仅包含索引列并且每行开销较小的表。
数据实际所需的空间,取决于各自的数据类型。手册中关于字符类型(包括固定长度类型)的详细信息:
短字符串(最多126个字节)的存储需求为1个字节加上实际的字符串,其中包括在情况下的空格填充 of
character
。长字符串的开销是1而不是4个字节。
所有类型的更多详细信息请参阅系统目录pg_type
。
数据库编码,特别是字符类型所需的空间。UTF-8使用最多四个字节来存储一个字符(但7-Bit-ASCII字符始终占用一个字节,即使在UTF-8中也是如此)。
其他可能影响您情况的小事项,例如TOAST - 对于64字节的字符串,这不应该影响您。
估算空间占用的一个简单方法是创建一个测试表,填充虚拟数据并使用数据库对象大小函数进行测量:
SELECT pg_size_pretty(pg_relation_size('tbl'));
包括索引:
SELECT pg_size_pretty(pg_total_relation_size('tbl'));
参见:
一项快速测试显示以下结果:
CREATE TABLE test(a text, b text);
INSERT INTO test -- quick fake of matching rows
SELECT chr((g/1000 +32)) || to_char(g%1000, 'FM000')
, repeat (chr(g%120 + 32), 64)
FROM generate_series(1,50000) g;
SELECT pg_size_pretty(pg_relation_size('test')); -- 5640 kB
SELECT pg_size_pretty(pg_total_relation_size('test')); -- 5648 kB
添加主键后:
ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a);
SELECT pg_size_pretty(pg_total_relation_size('test')); -- 6760 kB
因此,我预计没有主键时最多会有44k行,有主键时最多会有36k行。
VACUUM
或CLUSTER
才能恢复。 - Erwin Brandstetter