PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Ile rekordów mogę przechowywać w 5 MB PostgreSQL w Heroku?

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 1

    Wię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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wykonać transakcje bazy danych za pomocą psycopg2/python db api?

  2. GROUP BY i agregacja kolejnych wartości liczbowych

  3. Nie można utworzyć żądanej usługi [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

  4. Błąd Heroku PostgreSQL GROUP_BY w aplikacji Rails

  5. pgpredict – Analiza predykcyjna w PostgreSQL