我多少记录可以在5 MB的PostgreSQL在Heroku存储?(How many records

2019-06-25 03:59发布

I'm going to store records in a single table with 2 fields:

  • id -> 4 characters

  • password_hash -> 64 characters

How many records like the one above will I be able to store in a 5mb PostgreSQL on Heroku?

P.S.: given a single table with x columns and a length of y - how can I calculate the space it will take in a database?

Answer 1:

磁盘占用空间

计算磁盘上的空间是不平凡的。 你必须考虑到:

  • 每桌的开销(小,基本上在系统目录中的条目,也不会影响您在Heroku)。

  • 每行(HeapTupleHeader)和每个数据页(PageHeaderData)的开销 。 如需详细了解手册中的页面布局 。

  • 空间丢失的数据类型对齐

  • 空间为NULL位图 。 有效地免费为8列或更少的表,无关你的情况。

  • 死行 UPDATE / DELETE

  • 指数(ES)的大小。 你将有一个主键,对不对? 索引大小类似于只索引列,少开销表。

  • 数据的实际空间需求,取决于相应的数据类型 。 对字符类型的信息手册中(包括固定长度的类型。) :

    一个短字符串(最多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行与主键。



文章来源: How many records can I store in 5 MB of PostgreSQL on Heroku?