PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie viele Datensätze kann ich in 5 MB PostgreSQL auf Heroku speichern?

Speicherplatz belegt

Die Berechnung des Speicherplatzes auf der Festplatte ist nicht trivial. Zu beachten sind:

  • Der Overhead pro Tabelle (gering, im Grunde die Einträge im Systemkatalog, kann sich auf Heroku nicht auswirken).

  • Der Aufwand pro Zeile (HeapTupleHeader) und pro Datenseite (PageHeaderData). Details zum Seitenlayout im Handbuch.

  • Platzverlust durch Datentypausrichtung .

  • Platz für ein NULL-Bitmap . Effektiv kostenlos für Tabellen mit 8 Spalten oder weniger, irrelevant für Ihren Fall.

  • Tote Reihen nach UPDATE / DELETE .

  • Größe von Index(en) . Sie haben einen Primärschlüssel, richtig? Die Indexgröße ähnelt der einer Tabelle mit nur den indizierten Spalten und weniger Overhead.

  • Der tatsächliche Platzbedarf der Daten, abhängig von den jeweiligen Datentypen . Details zu Zeichentypen (inkl. Typen mit fester Länge) im Handbuch:

    Der Speicherbedarf für einen kurzen String (bis 126 Byte) beträgt 1 Byte plus den eigentlichen String, der bei character das Leerzeichen enthält . Längere Strings haben 4 Byte Overhead statt 1

    Weitere Details für alle Typen im Systemkatalog pg_type .

  • Die Codierung der Datenbank insbesondere für Zeichentypen. UTF-8 verwendet bis zu vier Bytes, um ein Zeichen zu speichern (Aber 7-Bit-ASCII-Zeichen belegen immer nur ein Byte, sogar in UTF-8.)

  • Andere kleine Dinge, die sich auf Ihren Fall auswirken können, wie TOAST - was Sie bei 64 Zeichenketten nicht beeinträchtigen sollte.

Mit Testfall rechnen

Eine einfache Methode, um eine Schätzung zu finden, besteht darin, eine Testtabelle zu erstellen, sie mit Dummy-Daten zu füllen und mit Datenbankobjektgrößenfunktionen zu messen::

SELECT pg_size_pretty(pg_relation_size('tbl'));

Inklusive Indizes:

SELECT pg_size_pretty(pg_total_relation_size('tbl'));

Ein Schnelltest zeigt folgende Ergebnisse:

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

Nach dem Hinzufügen eines Primärschlüssels:

ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a);

SELECT pg_size_pretty(pg_total_relation_size('test')); -- 6760 kB

Ich würde also maximal etwa 44k erwarten Zeilen ohne und um 36k Zeilen mit Primärschlüssel.