Zajęte miejsce na dysku
Obliczenie miejsca na dysku nie jest trywialne. Musisz wziąć pod uwagę:
-
Narzut na tabelę (małe, w zasadzie wpisy w katalogu systemowym, mogą nie mieć wpływu na Heroku).
-
narzut na wiersz (HeapTupleHeader) i na stronę danych (PageHeaderData). Szczegóły dotyczące układu strony w podręczniku.
-
Utracono miejsce na wyrównanie typu danych .
-
Miejsce na mapę bitową NULL . Skutecznie za darmo dla tabel z 8 kolumnami lub mniej, nieistotne w Twoim przypadku.
-
Martwe rzędy po
UPDATE
/DELETE
. -
Rozmiar indeksów . Będziesz miał klucz podstawowy, prawda? Rozmiar indeksu jest podobny do rozmiaru tabeli tylko z zaindeksowanymi kolumnami i mniejszym obciążeniem.
-
Rzeczywiste zapotrzebowanie na miejsce na dane, w zależności od odpowiednich typów danych . Szczegóły dotyczące typów znaków (w tym typów o stałej długości) w instrukcji:
Wymagane przechowywanie krótkiego ciągu (do 126 bajtów) to 1 bajt plus rzeczywisty ciąg, który obejmuje dopełnienie spacji w przypadku
character
. Dłuższe ciągi mają 4 bajty narzutu zamiast 1Więcej szczegółów dla wszystkich typów w katalogu systemowym
pg_type
. -
kodowanie bazy danych w szczególności dla typów postaci. UTF-8 używa do czterech bajtów do przechowywania jednego znaku (ale 7-bitowe znaki ASCII zawsze zajmują tylko jeden bajt, nawet w UTF-8.)
-
Inne drobiazgi, które mogą wpłynąć na Twoją sprawę, takie jak TOAST - co nie powinno mieć wpływu na 64 ciągi znaków.
Oblicz za pomocą przypadku testowego
Prostą metodą znalezienia oszacowania jest utworzenie tabeli testowej, wypełnienie jej fikcyjnymi danymi i pomiar za pomocą funkcji rozmiaru obiektu bazy danych::
SELECT pg_size_pretty(pg_relation_size('tbl'));
W tym indeksy:
SELECT pg_size_pretty(pg_total_relation_size('tbl'));
Szybki test pokazuje następujące wyniki:
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 dodaniu klucza podstawowego:
ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a);
SELECT pg_size_pretty(pg_total_relation_size('test')); -- 6760 kB
Spodziewam się więc maksymalnie około 44k wiersze bez i około 36k wiersze z kluczem podstawowym.