Eine schnelle PostgreSQL-Datenbank ist eine Datenbank, deren häufig gelesene Daten in den Arbeitsspeicher passen. Die gesamte Dimensionierung geht davon aus: das Volumen der Datenbank, der Teil, der wirklich arbeitet, die Zahl der Verbindungen, dann die Festplatte und ihre Reserve. Dieser Leitfaden gibt Ihnen die Methode, die Starteinstellungen für 4, 8 und 16 GB Arbeitsspeicher und die Abfragen, die eine bestehende Datenbank vermessen.
shared_buffers auf 25 % des Arbeitsspeichers, effective_cache_size auf 75 %, random_page_cost = 1.1 auf NVMe-SSD.pg_dump, außerhalb des Servers, und stellen Sie regelmäßig wieder her, um es zu prüfen.Der Arbeitsspeicher eines Datenbankservers dient zuerst als Cache: eine aus dem Speicher gelesene Seite wird weit schneller ausgeliefert als eine von der Festplatte gelesene, selbst von NVMe. Die Frage ist also nicht nur „Wie groß ist die Datenbank?“, sondern „Welcher Teil wird häufig gelesen?“. Eine Datenbank von 50 GB, von der nur die letzten zwölf Monate abgefragt werden, arbeitet vielleicht mit 8 GB.
Bei einer bestehenden Datenbank liefern zwei Abfragen das Gesamtvolumen und die größten Tabellen, Indizes inklusive:
SELECT pg_size_pretty(pg_database_size(current_database()));
SELECT relname AS tabelle,
pg_size_pretty(pg_total_relation_size(relid)) AS groesse_mit_indizes
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;
Für eine künftige Datenbank schätzen Sie Tabelle für Tabelle: erwartete Zeilen nach einem Jahr × durchschnittliche Zeilengröße, dann kommen die Indizes hinzu, die üblicherweise 30 bis 100 % der Daten wiegen. Beispiel: 2 Millionen Zeilen pro Monat zu je 500 Byte ergeben 12 GB Daten nach einem Jahr und 18 bis 24 GB mit den Indizes.
PostgreSQL hält gelesene Seiten auf zwei Ebenen: in seinem eigenen Cache (shared_buffers) und im Datei-Cache des Systems. Seine Dokumentation empfiehlt, auf einem dedizierten Server mit 25 % des Arbeitsspeichers für shared_buffers zu beginnen, und stellt fest, dass über 40 % hinaus der Gewinn selten wird: der Rest kommt dem Cache des Systems und den Sortiervorgängen zugute.
| Parameter | 4 GB | 8 GB | 16 GB | Rolle |
|---|---|---|---|---|
shared_buffers | 1 GB | 2 GB | 4 GB | Der eigene Cache von PostgreSQL |
effective_cache_size | 3 GB | 6 GB | 12 GB | Der geschätzte Gesamt-Cache, der die Wahl der Abfragepläne lenkt |
work_mem | 8 MB | 16 MB | 32 MB | Der Speicher jedes Sortier- oder Hash-Vorgangs, pro Verbindung: mit der Zahl gleichzeitiger Abfragen zu multiplizieren |
maintenance_work_mem | 256 MB | 512 MB | 1 GB | Das Erstellen von Indizes und VACUUM |
random_page_cost | 1.1 | 1.1 | 1.1 | Die geschätzten Kosten eines wahlfreien Lesezugriffs: standardmäßig 4, weit über den tatsächlichen Kosten auf NVMe-SSD |
Diese Werte setzen eine Datenbank allein auf dem Server voraus. Läuft die Anwendung daneben, ziehen Sie zuerst ihren Speicherbedarf ab (Prozesse, Cache, Build) und wenden die Prozentsätze auf den Rest an: ein Server mit 8 GB, der eine Anwendung mit 3 GB betreibt, wird eingestellt wie ein Datenbankserver mit 5 GB.
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
random_page_cost = 1.1
shared_buffers wird erst beim Neustart von PostgreSQL wirksam; die übrigen Parameter werden ohne Unterbrechung neu geladen, per SELECT pg_reload_conf();.
Ob der Arbeitsspeicher reicht, zeigt die Cache-Trefferquote. Bei einer Geschäftsanwendung oder einer Website liegt sie über 99 %:
SELECT round(100.0 * blks_hit / nullif(blks_hit + blks_read, 0), 2) AS cache_trefferquote
FROM pg_stat_database
WHERE datname = current_database();
PostgreSQL öffnet einen Prozess pro Verbindung und akzeptiert standardmäßig 100 (max_connections). Jeder Prozess belegt im Leerlauf einige Megabyte, mehr, wenn er Daten sortiert oder hasht (work_mem, manchmal mehrfach in einer einzigen Abfrage). max_connections auf 500 anzuheben, um mit einer gesprächigen Anwendung Schritt zu halten, setzt den Server der Gefahr aus, bei der ersten Spitze keinen Arbeitsspeicher mehr zu haben.
Die richtige Antwort ist ein Connection Pooler: PgBouncer im Modus transaction lässt Hunderte Verbindungen der Anwendung einige Dutzend echte Verbindungen teilen. Auch die Frameworks haben ihren eigenen Pool (SQLAlchemy, Prisma, HikariCP): richten Sie seine Größe nach der Zahl der vCPU des Datenbankservers aus statt nach der Zahl der Nutzer.
Die Festplatte eines PostgreSQL-Servers trägt mehr als die Tabellen:
max_wal_size), mehr während eines Massenimports und noch mehr, wenn die Archivierung des Logs in Rückstand gerät.work_mem überschreiten.VACUUM FULL und der Neuaufbau eines Index schreiben eine vollständige Kopie, bevor sie die alte freigeben.Die Regel: das Volumen in einem Jahr, plus mindestens 30 % Reserve. Das ist kein Komfort: füllt sich die Festplatte, die das Transaktionslog trägt, hält PostgreSQL an, um seine Daten zu schützen. Überwachen Sie die Belegung und erweitern Sie vor 80 %.
Bei der Leistung zählt vor allem das Schreiben. Jeder Commit wartet, bis das Transaktionslog auf der Festplatte steht, also bestimmt die Latenz des Speichers den Schreibdurchsatz. Hier macht eine NVMe-SSD den Unterschied, weit mehr als beim Lesen, das der Arbeitsspeicher schon bedient.
Eine PostgreSQL-Abfrage läuft auf einem einzigen Kern, außer bei großen Lesevorgängen, die die Datenbank parallelisiert. Die Zahl der vCPU bestimmt also, wie viele schwere Abfragen gleichzeitig laufen: 2 vCPU genügen einer Geschäftsanwendung zum Start, 4 bis 8 passen für stark beanspruchte Datenbanken und aufwendige Berichte.
Bevor Sie vCPU hinzufügen, suchen Sie die Abfragen, die sie verbrauchen. Die Erweiterung pg_stat_statements sortiert sie nach Gesamtzeit:
shared_preload_libraries = 'pg_stat_statements'
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
SELECT calls, round(total_exec_time) AS ms_gesamt,
round(mean_exec_time::numeric, 1) AS ms_mittel, query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
Zum Start ist die Datenbank auf demselben Server wie die Anwendung die richtige Wahl: keine Netzwerklatenz zwischen beiden, eine Verbindung über einen Unix-Socket, ein einziger Server, den es zu sichern und zu überwachen gilt. Getrennt wird, wenn beide um die Ressourcen konkurrieren: ein Build oder eine Traffic-Spitze, die den Cache der Datenbank leert, eine Datenbank, die den gesamten Arbeitsspeicher für ihre Daten braucht, oder unterschiedliche Anforderungen an die Backups.
listen_addresses = 'localhost', solange sich nur die Anwendung auf dem Server verbindet. Muss ein anderer Server zugreifen, öffnen Sie Port 5432 nur für seine Adresse, in der Firewall und in pg_hba.conf.scram-sha-256 in pg_hba.conf, eine Rolle pro Anwendung, ohne Superuser-Rechte.pg_dump, außerhalb des Servers kopiert.pg_dump -Fc -d meine_db -f meine_db-$(date +%F).dump
createdb meine_db_test
pg_restore -d meine_db_test meine_db-2026-10-29.dump
Der VPS Pro läuft auf Intel-Xeon-Prozessoren, ECC-Speicher, der Fehler im laufenden Betrieb korrigiert, und gespiegelten NVMe-SSDs; jeder Datenblock wird per Prüfsumme verifiziert, und jede Nacht entsteht ein verschlüsseltes Backup außerhalb der Maschine. Der Full-Stack-Support ist inbegriffen: wird Ihre Datenbank langsamer, analysieren wir die langsamen Abfragen und die Indizes und nennen Ihnen die Einstellungen, die Ihrer Anwendung ihre Geschwindigkeit zurückgeben.
Genug, damit die häufig gelesenen Daten in den Arbeitsspeicher passen. Für eine Geschäftsanwendung zum Start genügen 4 GB, Datenbank und Anwendung inklusive. Danach messen Sie die Cache-Trefferquote: solange sie über 99 % bleibt, reicht der Arbeitsspeicher.
25 % des Arbeitsspeichers auf einem Server, der nur die Datenbank betreibt, wie es die Dokumentation von PostgreSQL empfiehlt: 1 GB bei 4 GB, 2 GB bei 8 GB, 4 GB bei 16 GB. Über 40 % hinaus wird der Gewinn selten, weil der Cache des Systems den Rest übernimmt.
PostgreSQL akzeptiert standardmäßig 100, und jede Verbindung ist ein Prozess, der Arbeitsspeicher verbraucht. Statt diese Obergrenze anzuheben, setzen Sie einen Connection Pooler wie PgBouncer vor die Datenbank: einige Dutzend echte Verbindungen bedienen dann Hunderte Verbindungen der Anwendung.
Nicht zum Start: auf demselben Server antwortet die Datenbank ohne Netzwerklatenz, und alles wird in einem Zug gesichert. Getrennt wird, wenn das eine das andere behindert, zum Beispiel wenn ein Build oder eine Traffic-Spitze den Cache der Datenbank leert.
Simafri
Sprechen wir über Ihr Vorhaben
Sagen Sie uns in wenigen Worten, was Sie brauchen: Wir melden uns schnell bei Ihnen.
Vielen Dank! Ihre Anfrage wurde gesendet. Wir melden uns in Kürze bei Ihnen.
Sie schreiben lieber eine E-Mail? Schreiben Sie uns an support@simafri.com.