【问题标题】:How many records can I store in 5 MB of PostgreSQL on Heroku?我可以在 Heroku 上的 5 MB PostgreSQL 中存储多少条记录?
【发布时间】:2012-06-08 18:51:48
【问题描述】:

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

  • id -> 4 个字符

  • password_hash -> 64 个字符

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

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

【问题讨论】:

  • 您是要将行插入数据库,还是要更新/删除它们?
  • 这对占用的空间有何影响?无论如何我不认为更新但删除操作可能是的
  • @MatteoPagliazzi:更新/删除会留下死行,占据只有VACUUMCLUSTER 可以恢复的空间。
  • 另外请记住,5mb 是一个“软”限制。你可以超越这一点。一旦你开始推送 50mb,他们会要求你升级。

标签: postgresql database-design heroku storage


【解决方案1】:

磁盘空间占用

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

  • 每个表的开销(很小,基本上是系统目录中的条目,可能不会影响您在 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 行有主键。

【讨论】:

    猜你喜欢
    • 2013-12-11
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多