TimescaleDB ist eine Open-Source-Erweiterung für PostgreSQL, die Zeitreihen-Daten schnell und skalierbar speichert. Statt einer eigenen Datenbank-Engine setzt sie auf normale PostgreSQL-Tabellen — sogenannte Hypertables — und ergänzt sie um automatische Partitionierung, Kompression und Aggregation. Administriert wird alles über den vertrauten psql-Client.
Erste Schritte
Die Erweiterung wird pro Datenbank aktiviert, danach kann eine normale Tabelle zur Hypertable werden:
psql -U postgres -d messwerte
CREATE EXTENSION IF NOT EXISTS timescaledb;
CREATE TABLE sensor (zeit timestamptz NOT NULL, sensor_id int, wert double precision);
SELECT create_hypertable('sensor', 'zeit');
create_hypertable partitioniert die Tabelle unsichtbar nach Zeit in Chunks — pro Chunk-Intervall (Standard 7 Tage, einstellbar mit chunk_time_interval) entsteht eine eigene PostgreSQL-Tabelle im Hintergrund.
Zeitreihen-Abfragen
Zeitliche Gruppierung übernimmt time_bucket(), das wie ein GROUP BY auf Zeitintervalle wirkt:
SELECT time_bucket('1 hour', zeit) AS stunde,
sensor_id, avg(wert) AS mittel
FROM sensor
WHERE zeit > now() - interval '24 hours'
GROUP BY stunde, sensor_id
ORDER BY stunde;
Continuous Aggregates und Kompression
- Continuous Aggregates (CAGGs): materialisierte, automatisch aktualisierte Aggregationen über
CREATE MATERIALIZED VIEWmittimescaledb.continuous-Einstellung — Abfragen über lange Zeiträume bleiben schnell. - Kompression:
ALTER TABLE sensor SET (timescaledb.compress, timescaledb.compress_segmentby = 'sensor_id');komprimiert ältere Chunks und spart typischerweise 10-20 × Speicher. - Retention:
add_retention_policy()löscht Chunks nach einer Frist automatisch.
Dateneingabe
Zeilen einfügen funktioniert mit normalem INSERT oder gebündelt mit COPY. Für Massenimporte parallelisiert das Go-Tool timescaledb-parallel-copy die PostgreSQL-Copy-Funktion:
timescaledb-parallel-copy --db-name messwerte --table sensor --file daten.csv --workers 8 --copy-options "CSV HEADER"
Praxis-Tipps
- Hypertables bleiben normale Tabellen: Indizes, Fremdschlüssel und Joins funktionieren unverändert.
- Für Hash-Partitionierung zusätzlich
partitioning_column+by_hashverwenden — sinnvoll bei sehr vielen Geräten. ALTER TABLE ... SET (timescaledb.compress_orderby = 'zeit DESC')steuert die Sortierung im komprimierten Chunk.
Verwandte Grundlagen: psql-Befehle, PostgreSQL-Befehle, InfluxDB-Befehle, Kusto-Befehle, Informix-Befehle.