Сколько записей я могу хранить в 5 МБ PostgreSQL на Heroku?
Я собираюсь хранить записи в одной таблице с 2 полями:
id -> 4 символа
password_hash -> 64 символа
Сколько записей, подобных приведенной выше, я смогу хранить в 5 Мб PostgreSQL на Heroku?
PS: учитывая одну таблицу с x столбцами и длиной y - как я могу рассчитать пространство, которое она займет в базе данных?
1 ответ
Дисковое пространство занято
Расчет места на диске не тривиален. Вы должны принять во внимание:
Издержки на таблицу (небольшие, в основном записи в системном каталоге, могут не повлиять на вас в 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
Таким образом, я ожидаю максимум около 44 тысяч строк без и около 36 тысяч строк с первичным ключом.