Lektionen des Moduls (2/4)
EXPLAIN und ANALYZE
Haben Sie sich jemals gefragt, wie die Datenbank entscheidet, ob sie den netten Index verwendet, den Sie gerade erstellt haben? Sobald Sie bei einer Abfrage die Eingabetaste drücken (z. B. ein langer Join mit einer verketteten Gruppe von), berechnet der Abfrageplaner spontan Dutzende von Strategien zur Ausführung der Abfrage und wählt diejenige aus, die theoretisch am schnellsten ist.
Aber als Entwickler müssen Sie in der Lage sein, in die dunklen Köpfe des Abfrageplaners zu blicken.
ERKLÄREN
Um herauszufinden, wie der Planer vorgehen will, geben Sie einfach das Zauberwort EXPLAIN an den Anfang Ihrer Abfrage.
EXPLAIN SELECT * FROM orders WHERE status = 'delivered';Das Ergebnis werden nicht die Bestellungen sein! Stattdessen sehen Sie den Plan in der Ausgabe (mit geschätzten Statistiken):
Seq Scan on orders (cost=0.00..25.88 rows=15 width=40)
Filter: (status = 'delivered'::text)Das sagt uns:
- Der Planner verwendet einen Seq Scan (brutales, sequentielles Lesen der gesamten Festplatte). Schlimm, wenn es Milliarden von Bestellungen gibt.
- Es wird geschätzt, dass etwa 15 Zeilen zurückgegeben werden, und die „Kosten“ werden in vorab geladenen CPU-Zyklen berechnet.
ERKLÄREN ANALYSE
Während EXPLAIN auf algorithmischen Schätzungen beruht (basierend auf globalen Statistiken, die in den letzten Stunden über die Daten berechnet wurden), führt EXPLAIN ANALYZE die Abfrage tatsächlich real aus** (und wartet auf die vollständigen logischen Ergebnisse) und vergleicht dabei die tatsächlich verstrichene Zeit in mathematisch absoluten Zahlen.
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 msHurra! Hier erfahren Sie, dass die Datenbank beschlossen hat, einen Index-Scan auf unseren sekundären idx_orders_cust-Index anzuwenden, der eine mikroskopische Ausführungszeit von einer Tausendstelsekunde benötigt und Millionen von Zeilen im laufenden Betrieb überspringt.
Du bist dran
Schreiben Sie einen einfachen EXPLAIN-Befehl, um herauszufinden, wie PostgreSQL Produkte mit einem aktuellen Lagerbestand von weniger als 10 Einheiten finden will. (Verwenden Sie in diesem Schritt nicht ANALYZE.)
Hinweis anzeigen
Stellen Sie einfach das Wort EXPLAIN am Anfang der vorhandenen Anweisung voran.
Lösung nach 3 Versuchen verfügbar
Wahre Kennzahlen erhalten
Wir wollen eine echte Leistungsdiagnose (Timings und Zyklen), keine mathematisch erratene Skizze. Verwenden Sie die dedizierte Anweisung, um die Suche ALLER „Kunden“, die sich vor dem 1. Januar 2025 angemeldet haben („signed_up_on“ < „2025-01-01“), durch tatsächliche Ausführung zu untersuchen.
Hinweis anzeigen
Fügen Sie das Wort ANALYZE direkt nach EXPLAIN hinzu.
Lösung nach 3 Versuchen verfügbar