Optimalisatie van SQL-query’s: Lees uitvoeringsplannen en repareer langzame query’s, met timing
Stop met raden waarom een zoekopdracht traag is. Leer een uitvoeringsplan lezen en pas vervolgens de verbeteringen toe die er het meest toe doen, met voor-en-na-metingen uit een echte tabel van een miljoen rijen.
- Begin met het uitvoeringsplan. Het vertelt u wat de database feitelijk doet.
- Zoek naar volledige scans op grote tabellen en voeg vervolgens indexen toe die overeenkomen met uw filters en joins.
- Vermijd het omsluiten van een geïndexeerde kolom in een functie, omdat dit het efficiënte indexgebruik kan tegenhouden.
- Meet voor en na, omdat elke database en dataset zich anders gedraagt.
Een zoekopdracht die vorig jaar milliseconden duurde, kan vandaag minuten duren, simpelweg omdat de tabel groter werd. SQL-queryoptimalisatie gaat niet zozeer over slimme trucs, maar meer over een herhaalbaar proces: ontdek wat de database doet, verwijder het verspilde werk en controleer of het heeft geholpen.
We hebben elke onderstaande techniek getest op een miljoen gegenereerde rijen in SQLite 3.50. De timing is de beste van meerdere runs vanaf één laptop, waarbij gebruik wordt gemaakt van een database in het geheugen. Ze passen niet bij uw systeem en PostgreSQL, MySQL en SQL Server hebben elk hun eigen optimizers en planformaten. Concentreer u op de omvang van elke verbetering en op de principes erachter.
Resultaten in één oogopslag
| Techniek | Voor | Na |
|---|---|---|
| Index op de filterkolom | 73 ms | 0,01 ms |
| Bereik in plaats van een functie op een kolom | 96 ms | 33 ms |
| Samengestelde index voor twee filters | 19 ms | 2,2 ms |
| Keyset in plaats van diepe OFFSET | 8,1 ms | 0,01 ms |
De testopstelling
CREATE TABLE customers (
id INTEGER PRIMARY KEY, name TEXT, city TEXT
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY, customer_id INT, status TEXT,
created TEXT, total INT, note TEXT
);
-- 50,000 customers and 1,000,000 orders with random values
Een eenvoudig optimalisatieproces
- Vind de zoekopdrachten die er toe doen. Gebruik trage zoekopdrachtlogboeken of monitoring. Een zoekopdracht van 200 ms die duizend keer per minuut wordt uitgevoerd, kan er meer toe doen dan een maandelijks rapport van 10 seconden.
- Lees het plan. Kijk wat de database werkelijk doet.
- Verander één ding. Voeg een index toe of herschrijf een deel van de query.
- Meet opnieuw op basis van realistische gegevens. Een plan op 100 testrijen vertelt je heel weinig over een miljoen.
- Bekijk het in de loop van de tijd. Plannen kunnen veranderen naarmate de gegevens toenemen en de statistieken veranderen.
Lees een uitvoeringsplan
Een uitvoeringsplan is de stapsgewijze strategie van de database voor het uitvoeren van een query, inclusief welke indexen de database gebruikt en in welke volgorde de database aan tabellen wordt toegevoegd. Voeg een voorvoegsel aan een query toe om deze te zien:
| Database | Commando |
|---|---|
| SQLiet | UITLEG QUERY PLAN SELECTEREN ... |
| PostgreSQL | UITLEG ANALYSEREN SELECTEREN ... |
| MySQL | EXPLAIN SELECT ..., of EXPLAIN ANALYZE |
| SQL-server | Werkelijk uitvoeringsplan in SSMS |
Merk op dat EXPLAIN ANALYZE in PostgreSQL de query daadwerkelijk uitvoert, dus wees voorzichtig als je deze gebruikt met UPDATE of DELETE. Hier is waar u eerst op moet letten:
| Zie je | Betekenis | Meestal |
|---|---|---|
| Scannen of Seq-scannen | Leest de hele tabel | Een probleem op grote tafels |
| Zoeken of indexeren | Springt naar overeenkomende rijen | Goed |
| Dekkende index | Alleen beantwoord vanuit de index | Zeer goed |
| Temp B-boom of Sorteren | Extra sorteerwerk | De moeite waard om te controleren |
Een volledige scan is niet automatisch slecht. Als een zoekopdracht het grootste deel van een kleine tabel nodig heeft, kan scannen de snelste keuze zijn. Vergelijk in PostgreSQL’s EXPLAIN ANALYZE ook geschatte rijen met werkelijke rijen. Een groot verschil betekent vaak dat tabelstatistieken verouderd zijn.
Voeg de juiste index toe
Met deze zoekopdracht worden de bestellingen van één klant gevonden:
SELECT id, total FROM orders WHERE customer_id = 123;
Voordat een index werd toegevoegd, was het plan een volledige scan:
SCAN orders
-- 20 rows in 73 ms
Vervolgens hebben we een index aan de filterkolom toegevoegd:
CREATE INDEX idx_orders_customer ON orders(customer_id);
SEARCH orders USING INDEX idx_orders_customer (customer_id=?)
-- 20 rows in 0.01 ms
Dezelfde twintig rijen kwamen duizenden keren sneller terug, omdat de database niet langer een miljoen rijen las om ze te vinden. Geen enkele andere techniek in dit artikel heeft ons een grotere overwinning opgeleverd. Goede eerste kandidaten zijn de kolommen die worden gebruikt in WHERE, JOIN en ORDER BY, vooral als ze de resultaten beperken tot een paar rijen. In onze gids voor SQL-indexen wordt uitgelegd hoe ze werken.
Plaats geïndexeerde kolommen niet in functies
Hier zijn twee manieren om bestellingen voor maart te vinden, met een index op created:
-- Function on the column
SELECT id FROM orders WHERE substr(created, 1, 7) = '2026-03';
-- SCAN orders USING COVERING INDEX idx_orders_created
-- 84,961 rows in 96 ms
-- Plain range
SELECT id FROM orders
WHERE created >= '2026-03-01' AND created < '2026-04-01';
-- SEARCH orders USING COVERING INDEX idx_orders_created (created>? AND created<?)
-- 84,961 rows in 33 ms
Beide retourneren identieke rijen, maar de eerste duurde ongeveer drie keer zo lang. Het plan laat zien waarom: met een functie op de kolom kan de database niet naar een positie in de gesorteerde index springen, dus moet hij door elke invoer heen SCAN. De range-versie kan SEARCH meteen op de juiste plaats terechtkomen. Een voorwaarde die op deze manier een index kan gebruiken, wordt sargable genoemd.
Hetzelfde probleem doet zich voor bij deze veelvoorkomende patronen:
| Vermijd | Liever |
|---|---|
WAAR JAAR(aangemaakt) = 2026 |
WHERE aangemaakt >= '01-01-2026' AND aangemaakt < '01-01-2027' |
WAAR prijs * 2 > 100 |
WAAR prijs > 50 |
WAAR LAGER(e-mail) = 'a@b.com' |
Een op functies gebaseerde index of een niet-hoofdlettergevoelige sortering |
WHERE naam LIKE '%99' |
Zoeken op voorvoegsel of zoeken in volledige tekst |
Dat laatste hebben we ook gecontroleerd. Er werd een leidende jokerteken geproduceerd SCAN customers, omdat een index gesorteerd vanaf de eerste letter niet kan helpen bij een match aan het eind.
Samengestelde indexen
Wanneer een query op twee kolommen filtert, doet een index met één kolom slechts een deel van de taak:
SELECT id FROM orders
WHERE status = 'paid'
AND created >= '2026-03-01' AND created < '2026-03-08';
-- Using only the created index: 6,198 rows in 19 ms
CREATE INDEX idx_status_created ON orders(status, created);
-- SEARCH orders USING COVERING INDEX idx_status_created
-- (status=? AND created>? AND created<?)
-- 6,198 rows in 2.2 ms
De kolomvolgorde is van groot belang. Een index op (status, created) werkt als een telefoonboek, gesorteerd op achternaam en vervolgens op voornaam. U kunt alleen een achternaam opzoeken, maar niet alleen een voornaam. Alleen al onze zoekopdracht op status zou deze index kunnen gebruiken. Door alleen op created te filteren, kan er doorgaans niet efficiënt gebruik van worden gemaakt. Als vuistregel plaatst u de met gelijkheid geteste kolommen eerst en de bereikkolommen erna.
In dat plan staat ook dat de index wordt gedekt, wat betekent dat de index alles bevatte wat de zoekopdracht nodig had, zodat de tabel zelf niet hoefde te worden gelezen. Door alleen de kolommen te selecteren die je nodig hebt, wordt dit waarschijnlijker, wat nog een reden is om dit te vermijden SELECT *.
Snellere paginering
Het gebruik van OFFSET voor diepe pagina’s brengt verborgen kosten met zich mee, omdat de database nog steeds langs alle overgeslagen rijen moet lopen:
-- Page deep into the results
SELECT id FROM orders ORDER BY id LIMIT 20 OFFSET 500000;
-- 8.1 ms
-- Keyset pagination: continue from the last id seen
SELECT id FROM orders WHERE id > 500000 ORDER BY id LIMIT 20;
-- 0.01 ms
Keyset-paginering blijft snel, hoe diep u ook gaat. Het voorkomt ook dat rijen tussen pagina’s verschuiven wanneer nieuwe gegevens worden toegevoegd. Het nadeel is dat gebruikers niet meteen naar pagina 5.000 kunnen springen, wat zelden echt nodig is. Op tafels met brede rijen, of met meer rijen om over te slaan, kan het gat veel groter zijn dan in onze test.
Tip: Onze timings meten één zoekopdracht tegelijk op een inactieve machine. Onder echte belasting richt een inefficiënte query meer schade aan, omdat deze ook vergrendelingen vasthoudt en met al het andere concurreert om geheugen, schijf en CPU.
Schrijf slankere query’s
- Selecteer alleen de kolommen die je nodig hebt.
SELECT *verzendt meer gegevens en kan voorkomen dat een index de zoekopdracht beantwoordt. - Vroeg filteren. Gebruik
WHEREom rijen te verwijderen vóór het groeperen, enHAVINGalleen voor voorwaarden voor aggregaties. Zie SQL GROUP BY en HAVING. - Gebruik LIMIT als je maar een paar rijen nodig hebt.
- Geef de voorkeur aan UNION ALL als u geen duplicaten wilt verwijderen. Onze test UNION versus UNION ALL laat zien wat dat bespaart.
- Vermijd onnodige DISTINCT. Vaak wordt een join verborgen die duplicaten oplevert.
- Gebruik EXISTS voor bestaanscontroles. Het kan stoppen bij de eerste overeenkomst, zoals uitgelegd in onze gids voor SQL-subquery’s.
- Let op N+1 zoekopdrachten. Eén zoekopdracht per rij in een lus, meestal veroorzaakt door applicatiecode, is vaak het echte probleem. Eén enkele join- of batchquery kan honderden round trips vervangen.
Sluit zich aan
Indexeer de kolommen waaraan u deelneemt. We hebben een rapport over de totale uitgaven gemaakt voor klanten in één stad, en het plan was precies wat u ervan verwachtte:
SELECT c.name, SUM(o.total)
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE c.city = 'Goa'
GROUP BY c.id;
-- SCAN c
-- SEARCH o USING COVERING INDEX idx_cover (customer_id=?)
-- 9,900 rows in 34 ms
Het scant de klanten en gebruikt vervolgens een index om ieders bestellingen te vinden. Zonder index op orders.customer_id zou de database voor elke klant veel meer werk moeten verzetten. Een index op de externe sleutel is een van de meest voorkomende en waardevolle toevoegingen die u kunt doen. Zie SQL-joins uitgelegd om uw begrip van de basisprincipes op te frissen.
Wanneer indexen u kosten
Indexen zijn niet gratis, dus voeg er niet één toe voor elke kolom:
- Langzamere schrijfbewerkingen. Bij elke invoeging, update en verwijdering moet ook elke index worden bijgewerkt.
- Meer opslagruimte en geheugen. Indexen kunnen groot worden op grote tabellen.
- Weinig voordeel bij niet-selectieve kolommen. Een index op een kolom waar of onwaar is mogelijk niet nuttig als de meeste rijen overeenkomen.
- Redundantie. Een index op
(a)is vaak niet nodig als je er al een hebt op(a, b).
Controleer regelmatig de gebruiksstatistieken en verwijder indexen die niets gebruikt. En houd de statistieken actueel met ANALYZE of het equivalent van uw database, omdat de optimalisatie ervan afhankelijk is om een goed plan te kiezen. Soms is het langzame deel een twist in plaats van een vraag. Langdurige transacties die vergrendelingen bevatten, kunnen ervoor zorgen dat een snelle zoekopdracht traag lijkt.
Veel voorkomende fouten
- Optimaliseren zonder te meten. Veel zelfverzekerde gissingen blijken verkeerd te zijn.
- Testen met kleine gegevens. Plannen en timings veranderen dramatisch naarmate de tabellen groter worden.
- Een tip voor een andere database vertrouwen. Advies voor de ene engine is mogelijk niet van toepassing op de andere.
- Het blindelings toevoegen van indexen. Elke index vertraagt het schrijven.
- Het effect van de eerste run wordt genegeerd. Met caches wordt een tweede run sneller uitgevoerd, dus meerdere keren rennen.
Tot slot
De meeste langzame query’s hebben gewone oorzaken: een ontbrekende index, een functie in een kolom of er worden te veel gegevens opgehaald. Neem deze week uw langzaamste echte zoekopdracht, voer EXPLAIN uit en zoek naar een volledige scan op een grote tafel. Corrigeer één ding, meet opnieuw en houd aantekeningen bij van wat u hebt gewijzigd.
Veelgestelde vragen
Wat is SQL-queryoptimalisatie?
Het is het proces waarbij query’s minder tijd en minder middelen verbruiken, meestal door uitvoeringsplannen te onderzoeken, geschikte indexen toe te voegen en inefficiënte query’s te herschrijven.
Wat is een uitvoeringsplan?
Het is de door de database gekozen strategie voor het uitvoeren van een query, inclusief hoe tabellen worden gelezen, welke indexen worden gebruikt en in welke volgorde deze worden samengevoegd.
Hoe vind ik langzame zoekopdrachten?
Schakel het langzame querylogboek van uw database in of gebruik tools zoals pg_stat_statements in PostgreSQL. Concentreer u vervolgens op zoekopdrachten met de hoogste totale tijd.
Maakt het toevoegen van een index zoekopdrachten altijd sneller?
Nee. Het helpt bij selectief lezen, maar vertraagt het schrijven en gebruikt opslagruimte. De optimalisatie kan dit ook negeren als de meeste rijen aan de voorwaarde voldoen.
Is SELECT * slecht voor de prestaties?
Het kan zijn. Het draagt onnodige gegevens over en kan voorkomen dat een index de zoekopdracht beantwoordt. Het is meestal beter om alleen de kolommen op te sommen die u nodig heeft.
Blijf leren
Hulp nodig met testen, WordPress of SEO?
We helpen teams betere software te leveren en hun sites te laten groeien. Vertel ons waar u mee bezig bent en wij stellen een duidelijke volgende stap voor.
Meer handleidingen over testen, AI en moderne ontwikkeling
Genoten van dit artikel? Kies een onderwerp en ga direct naar onze nieuwste tutorials.
AI-hallucinaties uitgelegd: waarom taalmodellen dingen verzinnen en hoe ze te verminderen
AI-hallucinaties uitgelegd: wat ze zijn, waarom taalmodellen ze produceren, veelvoorkomende typen, hoe je ze kunt verminderen met aarding en aanwijz…
Lees artikel →DevOpsOmgevingsvariabelen uitgelegd: .env-bestanden, geheimen en configuratie goed gedaan
Omgevingsvariabelen uitgelegd met Python-voorbeelden die we hebben uitgevoerd: ze lezen en instellen, waarom elke waarde een string is, .env-bestand…
Lees artikel →SoftwareontwikkelingAPI-snelheidsbeperking uitgelegd: algoritmen, headers en afhandeling van 429-fouten
API-snelheidsbeperking uitgelegd met een simulatie die we hebben uitgevoerd: token-bucket, vast venster, schuifvenster, 429 reacties, headers van sn…
Lees artikel →TestautomatiseringSpotten in Python: unittest.mock, patch en de fouten die tests doen liegen
Spotten in Python met unittest.mock, getest: Mock en return_value, side_effect, patchen waar een naam wordt gebruikt, spec en autospec, spotdatums e…
Lees artikel →SoftwaretestenCodedekking uitgelegd: lijn versus filiaaldekking en wat 100% werkelijk betekent
Codedekking uitgelegd met een echte dekking.py-run: dekking van lijnen, vertakkingen en condities, een rapport lezen, waarom 100% dekking nog steeds…
Lees artikel →Databases & SQLDELETE versus TRUNCATE versus DROP in SQL: verschillen, terugdraaien en wanneer elk te gebruiken
DELETE versus TRUNCATE versus DROP uitgelegd met geteste SQL: wat elk verwijdert, terugdraaien, triggers, identiteitsreset, snelheid en hoe PostgreS…
Lees artikel →Databases & SQLSQL-weergaven uitgelegd: creëer, gebruik en vermijd de valkuilen, met voorbeelden
SQL-weergaven uitgelegd met query's die we hebben uitgevoerd: een weergave maken, live resultaten, kolommen verbergen, prestaties, bijwerkbare en ge…
Lees artikel →SoftwareontwikkelingTypeScript-interface versus type: echte verschillen, getest met de compiler
TypeScript-interface versus type, gecontroleerd met de echte compiler: wat beide kunnen doen, wat slechts één kan doen, samenvoegen van declaraties,…
Lees artikel →SoftwareontwikkelingPython *args en **kwargs uitgelegd: flexibele functies met duidelijke voorbeelden
Python *args en **kwargs uitgelegd met code die we hebben uitgevoerd: in- en uitpakken, parametervolgorde, argumenten die alleen trefwoorden en posi…
Lees artikel →SoftwareontwikkelingPython Lambda-functies: syntaxis, echt gebruik en wanneer u ze niet moet gebruiken
Python lambda-functies uitgelegd met code die we hebben uitgevoerd: syntaxis, sorteren met sleutel, kaart en filter, sluitingen, de laat-bindende va…
Lees artikel →Kunstmatige intelligentieWat zijn AI-agenten? Hoe ze werken, met een eenvoudige agentloop die u kunt uitvoeren
Wat zijn AI-agenten? Een duidelijke gids voor de agentenlus, tools, geheugen en vangrails, met een kleine Python-lus die we hebben uitgevoerd, echte…
Lees artikel →DevOpsMonitoring versus waarneembaarheid: het echte verschil, met logboeken, statistieken en sporen
Monitoring versus waarneembaarheid uitgelegd: bekende en onbekende fouten, logboeken, statistieken en sporen, een walkthrough voor afrekenincidenten…
Lees artikel →DevOpsDocker-volumes versus bindingsmounts: bewaar containergegevens op de juiste manier
Docker-volumes versus bind-mounts uitgelegd: waarom containergegevens verdwijnen, benoemde volumes, bind-mounts, tmpfs, Compose-voorbeelden, back-up…
Lees artikel →TestautomatiseringTDD versus BDD: belangrijkste verschillen, één functie die op beide manieren is gebouwd en wanneer deze moet worden gebruikt
TDD versus BDD uitgelegd met één kortingsfunctie die in beide richtingen is gebouwd: rood-groen-refactor met code die we hebben uitgevoerd, gegeven-…
Lees artikel →SoftwaretestenGebruikersacceptatietesten (UAT): proces, checklist en echte voorbeelden
Gebruikersacceptatietesten uitgelegd: wie voert het uit, hoe het verschilt van QA, een proces in zeven stappen, een UAT-testcase-sjabloon, een check…
Lees artikel →Databases & SQLSQL NULL-waarden uitgelegd: IS NULL, COALESCE, NULLIF en de te vermijden vallen
SQL NULL-waarden uitgelegd met query's die we hebben uitgevoerd: logica met drie waarden, IS NULL, COALESCE, NULLIF, hoe aggregaten, joins en sorter…
Lees artikel →Databases & SQLSQL CASE WHEN-instructie: syntaxis, echte voorbeelden en veelvoorkomende fouten
SQL CASE WHEN uitgelegd met vragen die we hebben uitgevoerd: eenvoudige en doorzochte formulieren, volgorde van de voorwaarden, draaipunten met SUM,…
Lees artikel →SoftwareontwikkelingWat is JWT? JSON-webtokens uitgelegd met een werkend voorbeeld
Wat is JWT? JSON Web Tokens uitgelegd: de drie delen, een token gebouwd en waarmee is geknoeid in de code die we hebben uitgevoerd, JWT versus sessi…
Lees artikel →SoftwareontwikkelingJavaScript-gebeurtenislus uitgelegd: call-stack, microtaken en timers met voorbeelden
De JavaScript-gebeurtenislus uitgelegd met code die we hebben uitgevoerd: call-stack, taak- en microtask-wachtrijen, waarom setTimeout 0 niet onmidd…
Lees artikel →SoftwareontwikkelingPython-generatoren en opbrengst uitgelegd: bespaar geheugen met echte voorbeelden
Python-generatoren en opbrengst uitgelegd met code die we hebben uitgevoerd: hoe ze pauzeren en hervatten, gemeten geheugenbesparingen, pijplijnen, …
Lees artikel →Kunstmatige intelligentieWat zijn inbeddingen? Vectoren en cosinusovereenkomst eenvoudig uitgelegd
Wat zijn insluitingen? Een gids in duidelijke taal over vectoren, cosinusovereenkomst en semantisch zoeken, met een klein voorbeeld dat we hebben ui…
Lees artikel →DevOpsImplementatie van blauwgroen versus kanarie: verschillen, afwegingen en hoe te kiezen
Blauw-groen versus kanarie-implementatie uitgelegd: hoe elk werkt, kosten, risico's en terugdraaien, stabiele gebruikersbucket die we hebben getest,…
Lees artikel →TestautomatiseringSchilferige tests: wat de oorzaak ervan is en hoe u ze voorgoed kunt oplossen
Zwakke tests uitgelegd met demo's die we hebben uitgevoerd: de belangrijkste oorzaken, hoe je er een kunt bevestigen en diagnosticeren, goede oploss…
Lees artikel →SoftwaretestenBelastingtesten versus stresstesten: verschillen, statistieken en k6-voorbeelden
Belastingtesten versus stresstesten uitgelegd: wat elk bewijst, piek- en soak-tests, de statistieken die er toe doen, waarom gemiddelden misleiden, …
Lees artikel →SoftwaretestenTestcase versus testscenario: belangrijkste verschillen, voorbeelden en wanneer deze te gebruiken
Testcase versus testscenario uitgelegd: duidelijke definities, een tabel naast elkaar, één functie voor het opnieuw instellen van wachtwoorden, over…
Lees artikel →Databases & SQLOptimalisatie van SQL-query's: lees uitvoeringsplannen en repareer langzame query's, met timing
Optimalisatie van SQL-query's getest op een miljoen rijen: lees uitvoeringsplannen, voeg de juiste indexen toe, repareer niet-sargeerbare filters, g…
Lees artikel →Databases & SQLSQL UNION versus UNION ALL: verschillen, voorbeelden en geteste prestaties
SQL UNION versus UNION ALL uitgelegd met de query's die we hebben uitgevoerd: duplicaten, de regels volgen beide, een echte databug, gemeten prestat…
Lees artikel →SoftwareontwikkelingJavaScript Fetch API-tutorial: GET, POST, foutafhandeling en time-outs
Een JavaScript Fetch API-tutorial getest tegen een lokale server: GET en POST, waarom 404 niet gooit, een herbruikbare helper, queryreeksen, time-ou…
Lees artikel →SoftwareontwikkelingPython-bestandsverwerking: lezen, schrijven, CSV, JSON en pathlib met voorbeelden
Het verwerken van Python-bestanden uitgelegd met code die we hebben uitgevoerd: open modi, met het lezen van grote bestanden, CSV, JSON, pathlib, bi…
Lees artikel →SoftwareontwikkelingPython-klassen en -objecten: OOP-zelfstudie met echte voorbeelden
Python-klassen en -objecten uitgelegd met code die we hebben uitgevoerd: __init__, methoden, klasse versus instantie-attributen, overerving, eigensc…
Lees artikel →Kunstmatige intelligentieWat is een groot taalmodel? Hoe LLM's werken, uitgelegd zonder de hype
Wat is een groot taalmodel? LLM's uitgelegd in duidelijke taal: tokens, inbedding, aandacht, training, temperatuur- en contextvensters, een kleine d…
Lees artikel →DevOpsLinux-opdrachten voor beginners: de essentiële terminalgids met voorbeelden
Linux-opdrachten voor beginners, gegroepeerd op taak: navigatie, bestanden, logboeken bekijken, grep, pipelines, machtigingen, processen en archieve…
Lees artikel →TestautomatiseringSelenium versus toneelschrijver: belangrijkste verschillen, code vergeleken en welke te kiezen
Selenium versus Playwright vergeleken: architectuur, wachten, browser- en taalondersteuning, debuggen, dezelfde test in beide tools, migratieadvies …
Lees artikel →SoftwaretestenEquivalentiepartitionering: testontwerptechniek uitgelegd met uitgewerkte voorbeelden
Equivalentiepartitionering uitgelegd: hoe je geldige en ongeldige partities kunt vinden, uitgewerkte voorbeelden voor leeftijden, wachtwoorden en ko…
Lees artikel →SoftwaretestenErnst versus prioriteit bij het testen van software: verschillen, matrix en echte voorbeelden
Ernst versus prioriteit bij het testen van software uitgelegd: duidelijke definities, een vierwegmatrix met voorbeelden, niveauschalen, wie deze bep…
Lees artikel →Databases & SQLTutorial voor SQL-subquery's: typen, gecorreleerde subquery's en BESTAAN met voorbeelden
Een SQL-subquery-tutorial met query's die we hebben uitgevoerd: scalaire, IN-, FROM- en SELECT-subquery's, gecorreleerde subquery's, EXISTS, de NOT …
Lees artikel →Databases & SQLSQL-transacties en ACID uitgelegd: COMMIT-, ROLLBACK- en isolatieniveaus
SQL-transacties en ACID uitgelegd met een bankoverschrijving die we hebben uitgevoerd: COMMIT, ROLLBACK, savepoints, locks, isolatieniveaus, dirty r…
Lees artikel →SoftwareontwikkelingGit Commands Cheat Sheet: de commando's die je daadwerkelijk gebruikt, met voorbeelden
Een spiekbriefje voor Git-opdrachten, gegroepeerd op taak: setup, staging, branches, remotes, stash, geschiedenis en fouten ongedaan maken, met uitv…
Lees artikel →SoftwareontwikkelingJavaScript-beloften uitgelegd: vervolgens catch, Promise.all en veelvoorkomende fouten
JavaScript-beloften uitgelegd met code die we hebben uitgevoerd: staten, dan en catch-ketens, foutafhandeling, Promise.all, allSettled, race en wat …
Lees artikel →SoftwareontwikkelingZelfstudie Python-woordenboek: methoden, voorbeelden en veelvoorkomende patronen
Een Python-woordenboektutorial met code die we hebben uitgevoerd: dictaten, sleutelmethoden, samenvoeg-, begrips-, tel- en groeperingspatronen en ve…
Lees artikel →Kunstmatige intelligentieWat is RAG? Retrieval-Augmented Generation uitgelegd met een werkend voorbeeld
Wat is RAG? Retrieval-augmented generatie stap voor stap uitgelegd: indexeren, chunken, insluiten, ophalen, een klein werkend Python-voorbeeld, eval…
Lees artikel →DevOpsTerraform-zelfstudie voor beginners: infrastructuur als code van het eerste bestand tot modules
Een Terraform-tutorial voor beginners: begin zonder cloudaccount, leer init, plan en pas toe, vervolgens variabelen, outputs, status, modules en een…
Lees artikel →DevOpsDocker versus Kubernetes: belangrijkste verschillen, hoe ze samenwerken en welke u nodig heeft
Docker vs Kubernetes legde uit: wat elk doet, dezelfde app draait met beide, Docker Compose en Swarm vergeleken, de dockershim veranderen en hoe je …
Lees artikel →TestautomatiseringPytest-tutorial voor beginners: armaturen, parametriseren en echte voorbeelden
Een pytest-tutorial voor beginners met tests die we hebben uitgevoerd op pytest 9.2: beweringen, armaturen, parametrize, conftest, markers, tmp_path…
Lees artikel →SoftwaretestenLevenscyclus van softwaretests (STLC): 6 fasen, in- en uitgangscriteria, voorbeeld
De levenscyclus van softwaretesten uitgelegd: zes STLC-fasen met in- en uitstapcriteria, deliverables, een voorbeeld van een uitgewerkte inlogfuncti…
Lees artikel →SoftwareontwikkelingGit merge vs rebase: verschillen, voorbeelden en wanneer je wat gebruikt
Git merge vs rebase uitgelegd met echte logoutput, een vergelijkingstabel, de gouden regel van rebase en een veilige teamwerkwijze.
Lees artikel →SoftwareontwikkelingPython list comprehension: syntaxis, voorbeelden en wanneer je het vermijdt
Python list comprehension uitgelegd: syntaxis, filteren, if-else, geneste lussen, gemeten tijden en wanneer een gewone for-lus beter is.
Lees artikel →Databases & SQLSQL JOIN uitgelegd met voorbeelden (Inner, Left, Right, Full)
Begrijp SQL joins stap voor stap met voorbeeldtabellen en queries: INNER, LEFT, RIGHT, FULL, CROSS en SELF, plus veelgemaakte fouten en prestatietips.
Lees artikel →