SQL Academy · Lektion

Valg af indekser til tidsserier

Vælg de rigtige indekser til tidsseriearbejdsbelastninger — det sammensatte indeks (device_id, ts DESC) dækker det almindelige mønster.

Lektion 4 af 414 trin

Valg af indekser til tidsserier er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.

Den almindelige forespørgsel på tidsseriedata

"Nylige data for én enhed":

SELECT * FROM metrics
WHERE device_id = 42
  AND ts >= NOW() - INTERVAL '24 hours'
ORDER BY ts DESC LIMIT 1000;

Sammensat indeks (device_id, ts DESC)

Standardindekset til tidsseriedata:

CREATE INDEX metrics_device_ts_idx
  ON metrics (device_id, ts DESC);

-- Equality on device_id, range + sort on ts: index handles both.

Hvorfor rækkefølgen betyder noget

  • (device_id, ts) — bedst til "denne enhed, nylige data"
  • (ts, device_id) — bedst til "dette tidspunkt, alle enheder"

Vælg ud fra fordelingen af forespørgsler.

BRIN til tabeller med kun tilføjelser

BRIN er meget lille — få MB for en tabel med en milliard rækker. Det er kun effektivt, når dataene er fysisk sorteret efter den indekserede kolonne (hvilket tidsseriedata normalt er):

CREATE INDEX metrics_ts_brin ON metrics USING BRIN (ts);
-- Excellent for "give me last 24 hours" on append-only tables.

B-tree kontra BRIN

  • B-tree — opslag på millisekunder efter et præcist id; opslag efter nylige tidspunkter
  • BRIN — hurtige intervalscanninger på monotone data; billig vedligeholdelse

Du kan kombinere dem: B-tree på (device_id), BRIN på (ts).

Indekser på hypertabeller

TimescaleDB udbreder indekser til alle blokke. Fjern ubrugte indekser — de koster på hver blok.

Partielle indekser til hyppigt brugte delmængder

Hvis 99 % af forespørgslerne rammer nylige data:

CREATE INDEX metrics_recent_idx
  ON metrics (device_id, ts DESC)
  WHERE ts >= NOW() - INTERVAL '7 days';
-- Issue: predicate must use literal date or be re-created periodically.

Undgå funktioner på indekskolonnen

Anvend ikke funktioner på den indekserede kolonne — det forhindrer brug af indekset:

-- BAD:
WHERE date_trunc('hour', ts) = $1
-- GOOD:
WHERE ts >= $1 AND ts < $1 + INTERVAL '1 hour'

Indeks til forespørgsler efter seneste række

Til "den seneste aflæsning pr. enhed" gør det rigtige indeks forespørgslen til en intervalscanning af indekset:

CREATE INDEX metrics_device_ts_idx ON metrics (device_id, ts DESC);

SELECT DISTINCT ON (device_id) device_id, ts, value
FROM metrics
ORDER BY device_id, ts DESC;
-- Uses the index to take the first row per device.

CLUSTER efter den hyppigst brugte rækkefølge

CLUSTER omordner tabellen fysisk efter et indeks. Engangsoperation; nye data tilføjes stadig i ankomstrækkefølge:

CLUSTER metrics USING metrics_device_ts_idx;
-- Cluster is heavy. TimescaleDB chunks help by keeping recent chunks small.

Hash-indeks til lighed med høj kardinalitet

Hash-indekser bruges sjældent til tidsseriedata, men de findes. Et B-tree på device_id er normalt tilstrækkeligt.

Opret ikke for mange indekser

Tidsserietabeller har mange skriveoperationer. Hvert indeks = skriveforstærkning. Tilføj kun det, du forespørger i.

Opsummering

Indeksering af tidsseriedata bygger på et lille antal mønstre.

  • Sammensat (entity, ts DESC) til forespørgsler pr. enhed
  • BRIN på ts til intervalforespørgsler i tabeller med kun tilføjelser
  • Hypertabeller: indekser udbredes til blokke
  • Undgå prædikater med funktioner på kolonner

Hurtigt tjek

Din mest belastende tidsserieforspørgsel filtrerer efter device_id og læser de seneste 24 timer. Hvilket indeks er bedst?

Gratis at komme i gang

Lær SQL med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
46
Lektioner
183

Ofte stillede spørgsmål

Er lektionen “Valg af indekser til tidsserier” gratis?

Ja — hele teksten til “Valg af indekser til tidsserier” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Valg af indekser til tidsserier”?

Vælg de rigtige indekser til tidsseriearbejdsbelastninger — det sammensatte indeks (device_id, ts DESC) dækker det almindelige mønster. Du øver dig i SQL Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på SQL Academy?

Der kræves ingen tidligere erfaring. SQL Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Valg af indekser til tidsserier”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne SQL Academy-lektion?

Ja. Alle SQL Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. TimescaleDB-hypertabeller
  2. Kontinuerlige aggregeringer
  3. Komprimerings- og opbevaringspolitikker
  4. Valg af indekser til tidsserier
← Tilbage til SQL Academy