我要将记录存储在具有 2 个字段的单个表中:
id -> 4 个字符
密码哈希 -> 64 个字符
我可以在 Heroku 上的 5mb PostgreSQL 中存储多少条类似的记录?
PS:给定一个包含 x 列和长度为 y 的表 - 我如何计算它将在数据库中占用的空间?
我要将记录存储在具有 2 个字段的单个表中:
id -> 4 个字符
密码哈希 -> 64 个字符
我可以在 Heroku 上的 5mb PostgreSQL 中存储多少条类似的记录?
PS:给定一个包含 x 列和长度为 y 的表 - 我如何计算它将在数据库中占用的空间?
计算磁盘空间并非易事。您必须考虑:
每张桌子的开销。小,基本上是系统目录中的条目。
每行( ) 和每个数据页 ( )的开销。手册中有关页面布局的详细信息。HeapTupleHeader
PageHeaderData
列对齐的空间丢失,具体取决于数据类型。
空位图的空间。对 8 列或更少的表格有效免费,与您的情况无关。
UPDATE
/之后的死行DELETE
。(直到空间最终被吸尘并重新使用。)
索引的大小。你会有一个主键,对吧?索引大小类似于只有索引列且每行开销较小的表。
数据的实际空间需求,取决于各自的数据类型。手册中字符类型(包括固定长度类型)的详细信息:
短字符串(最多 126 个字节)的存储要求是 1 个字节加上实际字符串,其中包括
character
. 较长的字符串有 4 个字节的开销,而不是 1 个
系统目录中所有类型的更多详细信息pg_type
。
特别是字符类型的数据库编码。UTF-8 最多使用四个字节来存储一个字符(但 7 位 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行有主键。