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 VIEW mit timescaledb.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_hash verwenden — 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.