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.
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?
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
- TimescaleDB-hypertabeller
- Kontinuerlige aggregeringer
- Komprimerings- og opbevaringspolitikker
- Valg af indekser til tidsserier