Místo na disku je obsazeno
Výpočet místa na disku není triviální. Musíte vzít v úvahu:
-
Režie na tabulku (malá, v podstatě položky v systémovém katalogu, vás na Heroku nemusí ovlivnit).
-
Režie na řádek (HeapTupleHeader) a na datovou stránku (PageHeaderData). Podrobnosti o rozložení stránky v manuálu.
-
Ztráta místa kvůli zarovnání typu dat .
-
Prostor pro bitmapu NULL . Účinně zdarma pro tabulky s 8 sloupci nebo méně, pro váš případ to není relevantní.
-
Nemrtvé řádky po
UPDATE
/DELETE
. -
Velikost indexů . Budete mít primární klíč, že? Velikost indexu je podobná velikosti tabulky pouze s indexovanými sloupci a menší režií.
-
Skutečné požadavky na prostor pro data v závislosti na příslušných typech dat . Podrobnosti o typech znaků (včetně typů s pevnou délkou) v příručce:
Požadavek na úložiště pro krátký řetězec (až 126 bajtů) je 1 bajt plus skutečný řetězec, což zahrnuje mezeru v případě
character
. Delší řetězce mají režii 4 bajty místo 1Více podrobností pro všechny typy v systémovém katalogu
pg_type
. -
Databáze kódování zejména pro typy postav. UTF-8 používá až čtyři bajty k uložení jednoho znaku (ale 7bitové ASCII znaky vždy zabírají pouze jeden bajt, dokonce i v UTF-8.)
-
Další drobnosti, které mohou ovlivnit váš případ, například TOAST - což by vás nemělo ovlivnit s 64 znakovými řetězci.
Výpočet pomocí testovacího případu
Jednoduchý způsob, jak najít odhad, je vytvořit testovací tabulku, naplnit ji fiktivními daty a měřit pomocí funkcí velikosti databázového objektu::
SELECT pg_size_pretty(pg_relation_size('tbl'));
Včetně indexů:
SELECT pg_size_pretty(pg_total_relation_size('tbl'));
Rychlý test ukazuje následující výsledky:
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
Po přidání primárního klíče:
ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a);
SELECT pg_size_pretty(pg_total_relation_size('test')); -- 6760 kB
Očekával bych tedy maximálně kolem 44k řádky bez a kolem 36 k řádky s primárním klíčem.