I'm going to store records in a single table with 2 fields:
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?
磁盘占用空间
计算磁盘上的空间是不平凡的。 你必须考虑到:
每桌的开销(小,基本上在系统目录中的条目,也不会影响您在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行与主键。