SQL Academy · Lektion

Partielle indekser og udtryksindekser

Indeksér kun de rækker, De har brug for, med WHERE-betingelser, og indeksér beregnede udtryk (lower(email), date_trunc('day', ts)).

Lektion 3 af 413 trin

Partielle indekser og udtryksindekser er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 3 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.

Partielt indeks: Indeksér et udsnit

Et partielt indeks dækker kun rækker, der matcher en WHERE-klausul, da indekset oprettes. Det er mindre, hurtigere og velegnet til den almindelige forespørgsel:

CREATE INDEX users_active_email_idx
  ON users(email)
  WHERE deleted_at IS NULL;

Hvornår partielle indekser er bedst

Brug dem når:

  • Du altid filtrerer efter det samme prædikat (f.eks. soft-delete)
  • Én værdi dominerer kolonnen (f.eks. har 95 % af rækkerne status='closed')
  • Du vil have et lille, aktivt indeks i cachen

Eksempel: Aktive sessioner

De fleste sessioner er udløbet; kun aktive sessioner forespørges:

CREATE INDEX sessions_active_idx ON sessions(user_id)
  WHERE expires_at > NOW();
-- Caveat: planner can't use NOW() in the index predicate — use a fixed timestamp
-- and reindex periodically, OR use a boolean column.

Bedre: Brug et stabilt prædikat

Indeksets prædikat skal være immutable. Tidsafhængige udtryk som NOW() opfylder ikke kravet. Brug i stedet en kolonne som is_active:

CREATE INDEX sessions_active_idx ON sessions(user_id)
  WHERE is_active = true;

-- The query must use the same predicate to match the index:
SELECT * FROM sessions WHERE is_active = true AND user_id = 42;

Udtryksindeks

Indeksér en funktion af en kolonne:

CREATE INDEX users_email_lower_idx ON users(LOWER(email));

SELECT * FROM users WHERE LOWER(email) = LOWER('Alice@Example.com');
-- Uses the expression index.

Almindelige udtryksindekser

  • LOWER(email) til søgning uden hensyn til store og små bogstaver
  • (price * tax_rate) til sortering efter beregnet værdi
  • date_trunc('day', created_at) til daglige rapporter
  • (data ->> 'user_id')::BIGINT til udtræk fra JSONB

Udtrykket skal være IMMUTABLE

Udtrykket skal være markeret som IMMUTABLE — resultatet må kun afhænge af inputtet. RANDOM(), NOW() og CURRENT_USER opfylder ikke kravet.

Kombination af partielt indeks og udtryksindeks

De to typer kan kombineres:

CREATE INDEX articles_active_title_idx
  ON articles(LOWER(title))
  WHERE published_at IS NOT NULL;

Unikke partielle indekser

Det klassiske mønster med "én aktiv række":

CREATE UNIQUE INDEX users_one_active_email
  ON users(email)
  WHERE deleted_at IS NULL;

-- Same email can exist many times in deleted users, but only once active.

Indeksets prædikat skal matche forespørgslen

Planner'en bruger kun det partielle indeks, når forespørgslens WHERE-klausul "indebærer" indeksets prædikat:

-- Index:  WHERE is_active = true
-- Match:  WHERE is_active = true AND user_id = 42       ✓
-- Match:  WHERE is_active AND user_id = 42             ✓
-- No:     WHERE user_id = 42                           ✗
-- No:     WHERE is_active IS NOT FALSE                 ✗ (logically same but planner may not realise)

Brug dem ikke for meget

Mange partielle indekser, der dækker adskilte udsnit, kan gøre skrivninger langsommere (hver INSERT skal opdatere alle relevante indekser). Brug dem sparsomt til forespørgsler, der ofte køres.

Opsummering

Partielle indekser og udtryksindekser giver mere funktionalitet pr. byte.

  • Partielt indeks: indeksér kun det udsnit, du forespørger
  • Udtryksindeks: indeksér beregnede værdier
  • Begge kræver IMMUTABLE-prædikater
  • Forespørgslen skal bruge det samme prædikat for at matche

Hurtigt tjek

Du vil slå e-mailadresser op uden hensyn til store og små bogstaver. Hvilket indeks er mest effektivt?

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 “Partielle indekser og udtryksindekser” gratis?

Ja — hele teksten til “Partielle indekser og udtryksindekser” 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 “Partielle indekser og udtryksindekser”?

Indeksér kun de rækker, De har brug for, med WHERE-betingelser, og indeksér beregnede udtryk (lower(email), date_trunc('day', ts)). 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 3 af 4.

Hvor lang tid tager lektionen “Partielle indekser og udtryksindekser”?

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. B-tree-, hash-, GiST- og GIN-indekser
  2. Sammensatte indekser og kolonnerækkefølge
  3. Partielle indekser og udtryksindekser
  4. Indeksvedligeholdelse og bloat
← Tilbage til SQL Academy