PostgreSQL Partitioning: Milliarden Zeilen performant abfragen
Wenn Tabellen auf Milliarden Zeilen wachsen, wird selbst indexiertes Querying langsam. Table Partitioning ist die Lösung, aber nur richtig implementiert.
Wann Partitioning nötig wird
Ab einer bestimmten Tabellengröße werden selbst B-Tree-Indexes ineffizient. VACUUM dauert Stunden, Backups werden zum Problem, und Queries treffen unnötig große Datenmengen. Partitioning teilt eine große Tabelle in kleinere, verwaltbare Teile.
Partitioning-Strategien
- Range Partitioning: Ideal für Zeitreihen-Daten. Partitionieren Sie nach Monat oder Quartal, Queries, die einen Zeitraum abfragen, scannen nur relevante Partitionen.
- List Partitioning: Für kategorische Daten wie Region, Mandant oder Status. Jede Partition enthält Zeilen mit bestimmten Werten.
- Hash Partitioning: Gleichmäßige Verteilung über eine feste Anzahl Partitionen, gut für Write-heavy Workloads ohne natürlichen Partitionsschlüssel.
Best Practices
- Partition Key im Query: Queries müssen den Partition Key in der WHERE-Klausel enthalten, damit Partition Pruning greift.
- Nicht zu viele Partitionen: Hunderte Partitionen verlangsamen den Query Planner. 12-36 aktive Partitionen sind ein guter Richtwert.
- Automatische Partition-Erstellung: Nutzen Sie pg_partman für automatische Erstellung und Verwaltung von Zeitreihen-Partitionen.
- Indexes pro Partition: Jede Partition hat eigene Indexes, das hält Index-Maintenance schnell.
Ergebnis
In einem E-Commerce-Projekt haben wir eine 2.4-Milliarden-Zeilen Order-Tabelle mit Range Partitioning nach Monat aufgeteilt. Die durchschnittliche Query-Zeit sank von 12 Sekunden auf 80 Millisekunden, ein Faktor 150x.
Fragen zu diesem Thema?
Wir beraten Sie gerne zu den in diesem Artikel beschriebenen Technologien und Lösungen.
Kontakt aufnehmenSeit über 25 Jahren realisieren wir Engineering-Projekte für Mittelstand und Enterprise.