Пространството на диска е заето
Изчисляването на пространството на диска не е тривиално. Трябва да вземете предвид:
-
Разходите за таблица (малки, основно записи в системния каталог, може да не ви повлияят на Heroku).
-
Нарежийните на ред (HeapTupleHeader) и на страница с данни (PageHeaderData). Подробности за оформлението на страницата в ръководството.
-
Загубено място за подравняване на типа данни .
-
Място за NULL растерно изображение . На практика безплатно за таблици от 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 редове с първичен ключ.