Schnellere Abfragen, einfachere Wartung großer Tabellen.
Range-Partitionierung¶
CREATE TABLE orders (
id SERIAL,
created_at TIMESTAMPTZ NOT NULL,
total DECIMAL
) PARTITION BY RANGE (created_at);
CREATE TABLE orders_2024_q1 PARTITION OF orders
FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');
List-Partitionierung¶
CREATE TABLE logs (id SERIAL, level TEXT, message TEXT)
PARTITION BY LIST (level);
CREATE TABLE logs_error PARTITION OF logs
FOR VALUES IN ('error','fatal');
pg_partman¶
CREATE EXTENSION pg_partman;
SELECT partman.create_parent('public.orders','created_at','native','monthly');
- 100M+ Zeilen
- Zeitreihendaten
- DROP PARTITION statt DELETE
Best Practices¶
Partitionierung lohnt sich ab etwa 100 Millionen Zeilen oder wenn Sie alte Datensaetze effizient loeschen muessen (DROP PARTITION ist sofort, DELETE kann Stunden dauern). PostgreSQL fuehrt automatisch Partition Pruning durch — eine Abfrage mit WHERE-Bedingung auf dem Partition Key liest nur relevante Partitions.
Fuer Zeitreihen ist Range-Partitionierung nach Monat oder Woche die haeufigste Wahl. Erwaegen Sie pg_partman fuer automatische Verwaltung — es erstellt neue Partitions im Voraus und kann alte archivieren oder loeschen. Hash-Partitionierung ist nuetzlich fuer gleichmaessige Datenverteilung, beispielsweise nach tenant_id in Multi-Tenant-Anwendungen. Bedenken Sie, dass Indizes auf jeder Partition separat erstellt werden muessen, obwohl PostgreSQL 11+ dies automatisch ueber Partitioned Indexes erledigen kann.
Partitionierung für große Tabellen¶
Beschleunigt Abfragen und vereinfacht die Wartung.