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)).
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 verdidate_trunc('day', created_at)for daglige rapporter(data ->> 'user_id')::BIGINTfor 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?
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
- B-tree-, hash-, GiST- og GIN-indekser
- Sammensatte indekser og kolonnerekkefølge
- Partielle indekser og uttrykksindekser
- Indeksvedlikehold og oppblåsing