SQL Academy · Les

Partiële indexen en expressie-indexen

Indexeer alleen de rijen die u nodig hebt met WHERE-clausules en indexeer berekende expressies (lower(email), date_trunc('day', ts)).

Les 3 van 413 stappen

Partiële indexen en expressie-indexen is een gratis SQL Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject SQL Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus SQL Academy bevat in totaal 4 lessen.

Gedeeltelijke index: een deelverzameling indexeren

Een gedeeltelijke index bevat alleen rijen die bij het aanmaken van de index aan een WHERE-clausule voldoen. Kleiner, sneller en ideaal voor de query voor het veelvoorkomende geval:

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

Wanneer gedeeltelijke indexen voordeel bieden

Gebruik ze wanneer:

  • Je altijd op hetzelfde predicaat filtert (bijvoorbeeld zachte verwijdering)
  • Eén waarde de kolom domineert (bijvoorbeeld 95% van de rijen heeft status='closed')
  • Je een kleine, veelgebruikte index in de cache wilt

Voorbeeld: actieve sessies

De meeste sessies zijn verlopen; alleen actieve sessies worden opgevraagd:

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.

Beter: gebruik een stabiel predicaat

Het indexpredicaat moet onveranderlijk zijn. Tijda�ankelijke expressies (NOW()) voldoen niet. Gebruik in plaats daarvan een kolom zoals 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;

Expressie-index

Indexeer een functie van een kolom:

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

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

Veelgebruikte expressie-indexen

  • LOWER(email) voor hoofdletterongevoelig zoeken
  • (price * tax_rate) voor sortering op berekende waarden
  • date_trunc('day', created_at) voor dagelijkse rapporten
  • (data ->> 'user_id')::BIGINT voor extracties uit JSONB

De expressie moet IMMUTABLE zijn

De expressie moet als IMMUTABLE zijn gemarkeerd: het resultaat hangt alleen af van de invoer. RANDOM(), NOW() en CURRENT_USER voldoen niet.

Combinatie van gedeeltelijke index en expressie-index

Je kunt beide combineren:

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

Unieke gedeeltelijke indexen

Het klassieke patroon voor "één actieve rij":

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.

Het indexpredicaat moet overeenkomen met de query

De queryplanner gebruikt de gedeeltelijke index alleen wanneer de WHERE-clausule van de query het indexpredicaat "impliceert":

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

Gebruik ze niet te vaak

Veel gedeeltelijke indexen voor niet-overlappende deelverzamelingen kunnen schrijfbewerkingen vertragen (elke INSERT moet alle relevante indexen bijwerken). Gebruik ze spaarzaam voor veelgebruikte queries.

Samenvatting

Gedeeltelijke indexen en expressie-indexen leveren meer resultaat per byte.

  • Gedeeltelijk: indexeer alleen de deelverzameling die je opvraagt
  • Expressie: indexeer berekende waarden
  • Voor beide zijn IMMUTABLE-predicaten vereist
  • De query moet hetzelfde predicaat gebruiken om overeen te komen

Korte controle

Je wilt hoofdletterongevoelig zoeken op e-mailadressen. Welke index is het efficiëntst?

Gratis beginnen

Leer SQL met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
46
Lessen
183

Veelgestelde vragen

Is de les “Partiële indexen en expressie-indexen” gratis?

Ja — de volledige tekst van “Partiële indexen en expressie-indexen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus SQL Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus SQL Academy bevat in totaal 4 lessen.

Wat leer ik in “Partiële indexen en expressie-indexen”?

Indexeer alleen de rijen die u nodig hebt met WHERE-clausules en indexeer berekende expressies (lower(email), date_trunc('day', ts)). Je oefent met SQL Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met SQL Academy te beginnen?

Ervaring vooraf is niet nodig. SQL Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “Partiële indexen en expressie-indexen”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over SQL Academy?

Ja. Elke les over SQL Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. B-tree-, hash-, GiST- en GIN-indexen
  2. Samengestelde indexen en kolomvolgorde
  3. Partiële indexen en expressie-indexen
  4. Indexonderhoud en bloat
← Terug naar SQL Academy