Voorbereiding op programmeerinterviews · Les

CTE versus subquery versus tijdelijke tabel

Afwegingen rond materialisatie, hergebruik en het gedrag van de optimizer

Les 3 van 413 stappen

CTE versus subquery versus tijdelijke tabel is een gratis Voorbereiding op programmeerinterviews-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 Voorbereiding op programmeerinterviews. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Voorbereiding op programmeerinterviews bevat in totaal 4 lessen.

Drie manieren om logica in stappen op te delen

Wanneer een query een tussenresultaat nodig heeft, heb je drie gangbare hulpmiddelen: een subquery, een CTE en een tijdelijke tabel. Interviewers vragen je ze te vergelijken omdat je keuze laat zien of je materialisatie en het gedrag van de optimizer begrijpt.

Deze les geeft je een besliskader dat je onder druk kunt opnoemen.

De subquery

Een subquery is een inline-query die in een andere query is genest, vaak in FROM, WHERE of SELECT. De subquery maakt deel uit van dezelfde instructie en de optimizer ziet alles als één geheel.

  • Heeft geen naam nodig (afgeleide tabellen hebben wel een alias).
  • De optimizer mag de subquery samenvoegen met de buitenste query.
  • Wordt lang en moeilijk leesbaar wanneer hij diep wordt genest.
SELECT *
FROM (
    SELECT customer_id, SUM(amount) AS total
    FROM orders
    GROUP BY customer_id
) t
WHERE t.total > 1000;

De CTE

Een CTE is een benoemde subquery in een WITH-blok, met een bereik van één instructie. De code leest beter dan een diep geneste subquery en je kunt er meerdere keren naar verwijzen.

  • Benoemd, waardoor de bedoeling wordt vastgelegd.
  • Kan meer dan één keer in dezelfde instructie worden gebruikt.
  • Heeft nog steeds het bereik van één instructie en verdwijnt daarna.
WITH spend AS (
    SELECT customer_id, SUM(amount) AS total
    FROM orders
    GROUP BY customer_id
)
SELECT *
FROM spend
WHERE total > 1000;

De tijdelijke tabel

Een tijdelijke tabel is een echte, fysieke tabel die gedurende de sessie (of transactie) blijft bestaan. Je vult hem met één instructie en raadpleegt hem in latere, afzonderlijke instructies.

  • Blijft bestaan in meerdere instructies binnen de sessie.
  • Er kunnen indexen op worden aangemaakt en statistieken voor worden verzameld.
  • Veroorzaakt schijf-I/O en vereist expliciete opruiming.
CREATE TEMP TABLE spend AS
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id;

SELECT * FROM spend WHERE total > 1000;

Materialisatie: het kernverschil

Het belangrijkste concept waar interviewers naar vragen is materialisatie: of het tussenresultaat fysiek ergens wordt weggeschreven.

  • Subquery's en CTE's worden meestal niet gematerialiseerd; de optimizer neemt ze vaak op in de buitenste query.
  • Een tijdelijke tabel wordt altijd gematerialiseerd in de opslag.
  • Bij sommige databases kun je met aanwijzingen het materialiseren van CTE's afdwingen of blokkeren.

Optimalisatiebarrières en de oude PostgreSQL-valkuil

Historisch gezien behandelde PostgreSQL elke CTE als een optimalisatiebarrière: de database materialiseerde de CTE en blokkeerde het naar beneden doorschuiven van predicaten. Sinds Postgres 12 worden eenvoudige niet-recursieve CTE's waarnaar één keer wordt verwezen standaard inline verwerkt, met de aanwijzingen MATERIALIZED en NOT MATERIALIZED om dit te overschrijven.

Als je deze nuance noemt, laat je sterke senioriteit zien.

WITH spend AS NOT MATERIALIZED (
    SELECT customer_id, SUM(amount) AS total
    FROM orders GROUP BY customer_id
)
SELECT * FROM spend WHERE total > 1000;

Hergebruik binnen één instructie

Als je in één instructie meerdere keren naar hetzelfde tussenresultaat verwijst, kan een CTE overzichtelijker zijn dan telkens dezelfde subquery herhalen. Let wel op: een inline verwerkte CTE kan bij elke verwijzing opnieuw worden berekend.

Wanneer opnieuw berekenen duur is, voorkomt het afdwingen van materialisatie (of het gebruik van een tijdelijke tabel) dat het werk twee keer wordt uitgevoerd.

Hergebruik tussen instructies

CTE's en subquery's bestaan slechts tijdens één instructie. Als je hetzelfde resultaat in meerdere afzonderlijke query's nodig hebt, is een tijdelijke tabel het juiste hulpmiddel.

Een typisch geval is een ETL-proces of rapport met meerdere stappen waarbij je één keer een voorbereidingsset opbouwt en er vervolgens meerdere analyses op uitvoert. Door de tijdelijke tabel te indexeren, kunnen alle vervolquery's sneller worden uitgevoerd.

Indexen en statistieken

Alleen een tijdelijke tabel kan indexen en actuele statistieken bevatten. Voor een enorme tussentijdse resultatenset die vaak wordt samengevoegd, kan dat doorslaggevend zijn.

  • CTE/subquery: de optimizer baseert schattingen op de onderliggende tabellen.
  • Tijdelijke tabel: je kunt er ANALYZE op uitvoeren en indexen toevoegen die zijn afgestemd op latere samenvoegingen.

Voor grote, intensief hergebruikte resultaten kan een tijdelijke tabel dus betere prestaties opleveren, ondanks de extra stappen.

Het besliskader

Een helder antwoord tijdens het sollicitatiegesprek:

  • Subquery: eenmalig, ondiep en goed leesbaar.
  • CTE: verbetert de leesbaarheid of je gebruikt hem een paar keer in één instructie.
  • Tijdelijke tabel: wordt tussen instructies hergebruikt, is zeer groot of vereist indexen/statistieken.

Kies standaard een CTE voor duidelijkheid; gebruik een tijdelijke tabel wanneer materialisatie of hergebruik tussen instructies echt voordeel oplevert.

Hoe je de afweging formuleert

Vermijd absolute uitspraken zoals 'CTE's zijn altijd trager'. Zeg in plaats daarvan: CTE's en subquery's worden meestal inline verwerkt, dus ze draaien vooral om leesbaarheid; een tijdelijke tabel wordt gematerialiseerd en is de moeite waard wanneer ik een grote resultaatset tussen instructies hergebruik of een index nodig heb.

Erkennen dat dit gedrag databasespecifiek is (en in Postgres versieafhankelijk) laat echte diepgang zien.

Korte controle

Kies het scenario waarin een tijdelijke tabel duidelijk de betere keuze is.

Samenvatting: CTE versus subquery versus tijdelijke tabel

De keuze draait om materialisatie en bereik.

  • Subquery's en CTE's: meestal inline verwerkt, beperkt tot één instructie en gekozen vanwege de leesbaarheid.
  • CTE's voegen naamgeving en hergebruik binnen één instructie toe.
  • Tijdelijke tabellen: altijd gematerialiseerd, blijven bestaan tussen instructies en kunnen worden geïndexeerd.
  • Postgres 12+ verwerkt eenvoudige CTE's inline; gebruik aanwijzingen met MATERIALIZED om dit te sturen.

Volgende stap: een verwarde geneste query ombouwen tot overzichtelijke CTE's.

Gratis beginnen

Leer Voorbereiding op programmeerinterviews 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
90
Lessen
360

Veelgestelde vragen

Is de les “CTE versus subquery versus tijdelijke tabel” gratis?

Ja — de volledige tekst van “CTE versus subquery versus tijdelijke tabel” 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 Voorbereiding op programmeerinterviews wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Voorbereiding op programmeerinterviews bevat in totaal 4 lessen.

Wat leer ik in “CTE versus subquery versus tijdelijke tabel”?

Afwegingen rond materialisatie, hergebruik en het gedrag van de optimizer Je oefent met Voorbereiding op programmeerinterviews 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 Voorbereiding op programmeerinterviews te beginnen?

Ervaring vooraf is niet nodig. Voorbereiding op programmeerinterviews 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 “CTE versus subquery versus tijdelijke tabel”?

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 Voorbereiding op programmeerinterviews?

Ja. Elke les over Voorbereiding op programmeerinterviews 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. Uw eerste CTE schrijven
  2. Meerdere CTE's aan elkaar koppelen
  3. CTE versus subquery versus tijdelijke tabel
  4. Geneste query's herstructureren tot CTE's
← Terug naar Voorbereiding op programmeerinterviews