sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan opretter man TimescaleDB Hypertable med tidspartitionering på ikke-entydigt tidsstempel?

Der er ingen grund til at skabe en unik begrænsning af tidsdimensionen. Dette virker:

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

Bemærk, at den primære nøgle på id er fjernet.

TimescaleDB kræver, at enhver unik begrænsning eller primær nøgle inkluderer tidsdimensionen. Dette svarer til begrænsning af PostgreSQL i deklarativ partitionering for at inkludere partitionsnøgle i en unik begrænsning:

TimescaleDB håndhæver også unikhed i hver chunk individuelt. Bevarelse af unikhed på tværs af bidder kan påvirke indtagelsesydelsen dramatisk.

Den mest almindelige tilgang at løse problemet med den primære nøgle er at oprette en sammensat nøgle og inkludere tidsdimensionen som foreslået i spørgsmålet. Hvis indekset på tidsdimensionen ikke er nødvendigt (der forventes ingen forespørgsler kun til tiden), så kan indekset på tid-dimensionen undgås:

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);

Det er også muligt at bruge en heltalskolonne som tidsdimension. Det er vigtigt, at en sådan kolonne har tidsdimensionsegenskaber:værdien stiger over tid, hvilket er vigtigt for insert-ydeevne, og forespørgsler vil vælge et tidsinterval, som er afgørende for forespørgselsydeevne over store databaser. Den almindelige sag er til lagring af unix-epoke.

Siden id i event_hyper er SERIEEL, vil den stige med tiden. Jeg tvivler dog på, at forespørgslerne vil vælge intervallet på det. For fuldstændighedens skyld vil SQL være:

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);


  1. Nulstil automatisk stigningssekvens pl-sql

  2. PostgreSQL Ingen Auto Increment-funktion?

  3. MySQL JOIN for at erstatte ID'er med værdi fra en anden tabel

  4. Hvordan kan jeg få tabelnavnet i en PostgreSQL triggerfunktion?