SQL Academy · leksjon

Partielle indekser og uttrykksindekser

Indekser bare radene du trenger, ved hjelp av WHERE-vilkår, og indekser beregnede uttrykk (lower(email), date_trunc('day', ts)).

Leksjon 3 av 413 trinn

Partielle indekser og uttrykksindekser er en gratis leksjon i SQL Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i SQL Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i SQL Academy inneholder totalt 4 leksjoner.

Partiell indeks: indekser et delsett

En partiell indeks omfatter bare rader som samsvarer med en WHERE-betingelse da indeksen ble opprettet. Den er mindre og raskere, og passer godt for den vanligste spørringen:

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

Når partielle indekser lønner seg

Bruk dette når:

  • De alltid filtrerer med det samme predikatet (for eksempel myksletting)
  • Én verdi dominerer kolonnen (for eksempel at 95 % av radene har status='closed')
  • De ønsker en liten indeks som ligger varmt i hurtigbufferet

Eksempel: aktive økter

De fleste øktene er utløpt; bare aktive økter blir etterspurt:

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: bruk et stabilt predikat

Indekspredikatet må være uforanderlig. Tidsavhengige uttrykk (NOW()) kvalifiserer ikke. Bruk 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;

Uttrykksindeks

Indekser en funksjon av 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.

Vanlige uttrykksindekser

  • LOWER(email) for søk uten hensyn til store og små bokstaver
  • (price * tax_rate) for sortering etter beregnet verdi
  • date_trunc('day', created_at) for daglige rapporter
  • (data ->> 'user_id')::BIGINT for uttrekking fra JSONB

Uttrykket må være IMMUTABLE

Uttrykket må være merket IMMUTABLE — resultatet avhenger bare av inndataene. RANDOM(), NOW() og CURRENT_USER kvalifiserer ikke.

Kombinasjon av partiell indeks og uttrykksindeks

De to kan kombineres:

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

Unike partielle indekser

Det klassiske mønsteret «én aktiv rad»:

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.

Indekspredikatet må samsvare med spørringen

Planleggeren bruker bare den partielle indeksen når spørringens WHERE-betingelse «impliserer» indekspredikatet:

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

Ikke overbruk dem

Mange partielle indekser som dekker disjunkte delsett, kan gjøre skriving tregere (hver INSERT må oppdatere alle relevante indekser). Bruk dem sparsomt for spørringer som er spesielt viktige.

Oppsummering

Partielle indekser og uttrykksindekser gir mer ytelse per byte.

  • Partiell: indekser bare delsettet De spør etter
  • Uttrykk: indekser beregnede verdier
  • Begge krever IMMUTABLE-predikater
  • Spørringen må bruke det samme predikatet for å samsvare

Hurtigsjekk

De ønsker oppslag etter e-postadresse uten hensyn til store og små bokstaver. Hvilken indeks er mest effektiv?

Gratis å komme i gang

Lær deg SQL med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
46
Leksjoner
183

Ofte stilte spørsmål

Er leksjonen «Partielle indekser og uttrykksindekser» gratis?

Ja – hele teksten i «Partielle indekser og uttrykksindekser» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av SQL Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i SQL Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Partielle indekser og uttrykksindekser»?

Indekser bare radene du trenger, ved hjelp av WHERE-vilkår, og indekser beregnede uttrykk (lower(email), date_trunc('day', ts)). Du øver på SQL Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med SQL Academy?

Ingen tidligere erfaring er nødvendig. SQL Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Partielle indekser og uttrykksindekser»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne SQL Academy-leksjonen?

Ja. Alle SQL Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. B-tree-, hash-, GiST- og GIN-indekser
  2. Sammensatte indekser og kolonnerekkefølge
  3. Partielle indekser og uttrykksindekser
  4. Indeksvedlikehold og oppblåsing
← Tilbake til SQL Academy