Сколько записей я могу хранить в 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 тысяч строк с первичным ключом.

Другие вопросы по тегам