14

我要将记录存储在具有 2 个字段的单个表中:

  • id -> 4 个字符

  • 密码哈希 -> 64 个字符

我可以在 Heroku 上的 5mb PostgreSQL 中存储多少条类似的记录?

PS:给定一个包含 x 列和长度为 y 的表 - 我如何计算它将在数据库中占用的空间?

4

1 回答 1

32

占用的磁盘空间

计算磁盘空间并非易事。您必须考虑:

  • 每张桌子的开销。小,基本上是系统目录中的条目。

  • 每行( ) 和每个数据页 ( )的开销手册中有关页面布局的详细信息。HeapTupleHeaderPageHeaderData

  • 列对齐的空间丢失,具体取决于数据类型。

  • 空位的空间。对 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行有主键。

于 2012-06-04T18:11:46.693 回答