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.
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):
Seq Scan on orders (cost=0.00..25.88 rows=15 width=40)
Filter: (status = 'delivered'::text)Dit vertelt ons:
- De Planner gebruikt een Seq Scan (brute, sequentiële lezing van de hele schijf). Slecht als er miljarden bestellingen zijn.
- 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.
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 90;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 msHoera! 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
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.)
Toon hint
Plaats gewoon het woord EXPLAIN aan het begin van de bestaande verklaring.
Oplossing beschikbaar na 3 pogingen
Waarheidsgetrouwe statistieken verkrijgen
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').
Toon hint
Voeg het woord ANALYSE toe direct na EXPLAIN.
Oplossing beschikbaar na 3 pogingen