PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie erstelle ich TimescaleDB Hypertable mit Zeitpartitionierung auf nicht eindeutigem Zeitstempel?

Es besteht keine Notwendigkeit, eine eindeutige Einschränkung für die Zeitdimension zu erstellen. Das funktioniert:

CREATE TABLE event (
  id serial,
  ts timestamp with time zone NOT NULL,
  details varchar(255) NOT NULL
);
SELECT create_hypertable('event', 'ts');

Beachten Sie, dass der Primärschlüssel auf id wird entfernt.

TimescaleDB erfordert, dass jede eindeutige Einschränkung oder jeder Primärschlüssel die Zeitdimension enthält. Dies ähnelt der Beschränkung von PostgreSQL bei deklarative Partitionierung So schließen Sie den Partitionsschlüssel in die eindeutige Einschränkung ein:

TimescaleDB erzwingt auch die Eindeutigkeit in jedem Chunk einzeln. Das Aufrechterhalten der Eindeutigkeit über Chunks hinweg kann die Erfassungsleistung dramatisch beeinträchtigen.

Der gebräuchlichste Ansatz Um das Problem mit dem Primärschlüssel zu beheben, erstellen Sie einen zusammengesetzten Schlüssel und fügen Sie die Zeitdimension ein, wie in der Frage vorgeschlagen. Wenn der Index für die Zeitdimension nicht benötigt wird (es werden keine Abfragen nur für die Zeit erwartet), kann der Index für die Zeitdimension vermieden werden:

CREATE TABLE event_hyper (
  id serial,
  ts timestamp with time zone NOT NULL,
  details varchar(255) NOT NULL,
  PRIMARY KEY (id, ts)
);

SELECT create_hypertable('event_hyper', 'ts', create_default_indexes => FALSE);

Als Zeitdimension kann auch eine Integer-Spalte verwendet werden. Es ist wichtig, dass eine solche Spalte über Zeitdimensionseigenschaften verfügt:Der Wert nimmt mit der Zeit zu, was für die Einfügeleistung wichtig ist, und Abfragen wählen einen Zeitbereich aus, der für die Abfrageleistung über große Datenbanken entscheidend ist. Der übliche Fall ist das Speichern von Unix-Epochen.

Seit id in event_hyper SERIAL ist, wird es mit der Zeit zunehmen. Ich bezweifle jedoch, dass die Abfragen den Bereich darauf auswählen. Der Vollständigkeit halber lautet SQL:

CREATE TABLE event_hyper (
  id serial PRIMARY KEY,
  ts timestamp with time zone NOT NULL,
  details varchar(255) NOT NULL
);

SELECT create_hypertable('event_hyper', 'id', chunk_time_interval => 1000000);