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

时间:2012-06-04 17:47:43

标签: postgresql database-design heroku storage

我要将记录存储在一个包含2个字段的表中:

  • id - > 4个字符

  • password_hash - > 64个字符

我可以在Heroku上的5mb PostgreSQL中存储多少个像上面那样的记录?

P.S。:给定一个包含x列且长度为y的表 - 如何计算它在数据库中的空间?

1 个答案:

答案 0 :(得分:15)

磁盘空间占用

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

  • 每个表的开销(小,基本上是系统目录中的条目,可能不会影响Heroku)。

  • 每行开销(HeapTupleHeader)和每个数据页(PageHeaderData)。有关page layout in the manual

  • 的详细信息
  • 空间丢失至data type alignment

  • NULL bitmap的空间。对于8列或更少的表格,实际上是免费的,与您的情况无关。

  • UPDATE / DELETE之后
  • 死行

  • 索引的大小。你会有一把主键,对吧?索引大小类似于仅包含索引列且开销较小的表的索引大小。

  • 数据的实际空间要求,具体取决于各自的数据类型Details for character types (incl. fixed length types) in the manual

      

    短字符串(最多126个字节)的存储要求是1个字节   加上实际的字符串,包括案例中的空格填充   character。较长的字符串有4个字节的开销而不是1个

    系统目录pg_type中所有类型的更多详细信息。

  • 数据库编码,特别是字符类型。 UTF-8最多使用四个字节来存储一个字符(但7位ASCII字符总是只占用一个字节,即使是UTF-8。)

  • 可能会影响您案件的其他小事,例如TOAST - 这对64字符串不会产生影响。

使用测试用例计算

查找估算值的一种简单方法是创建一个测试表,用虚拟数据填充它并使用database object size functions:进行测量:

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 行和主键。