Direct naar de hoofdinhoud
Module 10 · Les 2 van 438/57 in de cursus~15 min
Modulelessen (2/4)

UITLEGGEN en ANALYSEREN

Heeft u zich ooit afgevraagd hoe de database kiest of deze mooie index die u zojuist hebt gemaakt, moet worden gebruikt? Zodra u op Enter drukt bij een zoekopdracht (bijvoorbeeld een lange join met een gekoppelde groep), berekent de Query Planner tientallen strategieën om de zoekopdracht uit te voeren en kiest hij degene waarvan wordt aangenomen dat deze in theorie de snelste is.

Maar als ontwikkelaar moet je in de duistere geest van de Query Planner kunnen kijken.

UITLEGGEN

Om te ontdekken hoe de Planner verder wil gaan, plaatst u gewoon het toverwoord EXPLAIN aan het begin van uw vraag.

SQL
EXPLAIN SELECT * FROM orders WHERE status = 'delivered';

Het resultaat zijn niet de bestellingen! In plaats daarvan ziet u het plan in de uitvoer (met geschatte statistieken):

Code
Seq Scan on orders  (cost=0.00..25.88 rows=15 width=40)
  Filter: (status = 'delivered'::text)

Dit vertelt ons:

  1. De Planner gebruikt een Seq Scan (brute, sequentiële lezing van de hele schijf). Slecht als er miljarden bestellingen zijn.
  2. Het schat dat er ~15 rijen zullen worden geretourneerd, en berekent de "kosten" in vooraf geladen CPU-cycli.

UITLEG ANALYSE

Hoewel EXPLAIN afhankelijk is van algoritmische gissingen (gebaseerd op globale statistieken die in de afgelopen paar uur over de gegevens zijn berekend), voert EXPLAIN ANALYZE de query daadwerkelijk uit (en wacht op de volledige logische resultaten), waarbij de werkelijk verstreken tijd in wiskundig absolute termen wordt vergeleken.

SQL
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 90;
Code
Index Scan using idx_orders_cust on orders  (cost=0.15..8.13 rows=4 width=40) (actual time=0.012..0.015 rows=4 loops=1)
  Index Cond: (customer_id = 90)
Planning Time: 0.081 ms
Execution Time: 0.033 ms

Hoera! Hier leert u dat de database heeft besloten een Indexscan toe te passen op onze secundaire idx_orders_cust index, waarbij een microscopische uitvoeringstijd van een duizendste van een seconde nodig is, waarbij miljoenen rijen in een mum van tijd worden overgeslagen.

Jouw beurt

Oefening#sql.m10.l2.e1
Pogingen: 0Laden…

Schrijf een eenvoudige EXPLAIN-opdracht om te ontdekken hoe PostgreSQL producten wil vinden met een huidige voorraad van minder dan 10 eenheden. (Gebruik ANALYSE niet in deze stap.)

Editor laden…
Toon hint

Plaats gewoon het woord EXPLAIN aan het begin van de bestaande verklaring.

Oplossing beschikbaar na 3 pogingen

Waarheidsgetrouwe statistieken verkrijgen

Oefening#sql.m10.l2.e2
Pogingen: 0Laden…

We willen een echte prestatiediagnose (timings en cycli), geen wiskundig geraden schets.\nGebruik de speciale instructie om, door deze daadwerkelijk uit te voeren, de zoekopdracht te bestuderen van ALLE 'klanten' die zich vóór 1 januari 2025 hebben aangemeld ('signed_up_on' < '2025-01-01').

Editor laden…
Toon hint

Voeg het woord ANALYSE toe direct na EXPLAIN.

Oplossing beschikbaar na 3 pogingen