Der Teil, den ich immer verwirrend fand, sind die Anschaffungskosten im Vergleich zu den Gesamtkosten. Ich google das jedes Mal, wenn ich es vergesse, was mich hierher zurückbringt, was den Unterschied nicht erklärt, weshalb ich diese Antwort schreibe. Das habe ich aus Postgres EXPLAIN
entnommen Dokumentation, erklärt, wie ich es verstehe.
Hier ist ein Beispiel aus einer Anwendung, die ein Forum verwaltet:
EXPLAIN SELECT * FROM post LIMIT 50;
Limit (cost=0.00..3.39 rows=50 width=422)
-> Seq Scan on post (cost=0.00..15629.12 rows=230412 width=422)
Hier ist die grafische Erklärung von PgAdmin:
(Wenn Sie PgAdmin verwenden, können Sie mit der Maus auf eine Komponente zeigen, um die Kostendetails zu lesen.)
Die Kosten werden als Tupel dargestellt, z. die Kosten für das LIMIT
ist cost=0.00..3.39
und die Kosten für das sequentielle Scannen von post
ist cost=0.00..15629.12
. Die erste Zahl im Tupel sind die Startkosten und die zweite Zahl sind die Gesamtkosten . Weil ich EXPLAIN
verwendet habe und nicht EXPLAIN ANALYZE
, diese Kosten sind Schätzungen, keine tatsächlichen Maßnahmen.
- Startkosten ist ein heikles Konzept. Es stellt nicht nur die Zeitspanne dar, bevor diese Komponente startet . Er repräsentiert die Zeitspanne zwischen dem Beginn der Ausführung der Komponente (Einlesen von Daten) und dem Zeitpunkt, an dem die Komponente ihre erste Zeile ausgibt .
- Gesamtkosten ist die gesamte Ausführungszeit der Komponente, vom Beginn des Einlesens der Daten bis zum Beenden des Schreibens der Ausgabe.
Als Komplikation enthalten die Kosten jedes "Eltern"-Knotens die Kosten seiner untergeordneten Knoten. In der Textdarstellung wird der Baum durch Einrückung dargestellt, z. LIMIT
ist ein Elternknoten und Seq Scan
ist sein Kind. In der PgAdmin-Darstellung zeigen die Pfeile vom Kind zum Elternteil – die Richtung des Datenflusses – was möglicherweise kontraintuitiv ist, wenn Sie mit der Graphentheorie vertraut sind.
Die Dokumentation besagt, dass die Kosten alle untergeordneten Knoten enthalten, aber beachten Sie, dass die Gesamtkosten des übergeordneten Knotens 3.39
sind ist viel kleiner als die Gesamtkosten seines untergeordneten 15629.12
. Die Gesamtkosten sind nicht inbegriffen, da eine Komponente wie LIMIT
muss nicht die gesamte Eingabe verarbeiten. Siehe EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND unique2 > 9000 LIMIT 2;
Beispiel in Postgres EXPLAIN
Dokumentation.
Im obigen Beispiel ist die Startzeit für beide Komponenten null, da keine der Komponenten eine Verarbeitung durchführen muss, bevor sie mit dem Schreiben von Zeilen beginnt:Ein sequenzieller Scan liest die erste Zeile der Tabelle und gibt sie aus. Das LIMIT
liest seine erste Zeile und gibt sie dann aus.
Wann müsste eine Komponente viel verarbeiten, bevor sie mit der Ausgabe von Zeilen beginnen kann? Es gibt viele mögliche Gründe, aber schauen wir uns ein klares Beispiel an. Hier ist die gleiche Abfrage wie zuvor, aber jetzt mit einem ORDER BY
Klausel:
EXPLAIN SELECT * FROM post ORDER BY body LIMIT 50;
Limit (cost=23283.24..23283.37 rows=50 width=422)
-> Sort (cost=23283.24..23859.27 rows=230412 width=422)
Sort Key: body
-> Seq Scan on post (cost=0.00..15629.12 rows=230412 width=422)
Und grafisch:
Nochmal der sequentielle Scan auf post
hat keine Startkosten:Es beginnt sofort mit der Ausgabe von Zeilen. Aber das Sortieren hat erhebliche Startkosten 23283.24
weil es die gesamte Tabelle sortieren muss, bevor es auch nur eine einzige Zeile ausgeben kann . Die Gesamtkosten der Sorte 23859.27
ist nur geringfügig höher als die Startkosten, was die Tatsache widerspiegelt, dass sobald der gesamte Datensatz sortiert wurde, die sortierten Daten sehr schnell ausgegeben werden können.
Beachten Sie, dass die Startzeit von LIMIT
23283.24
ist genau gleich der Startzeit der Sorte. Das liegt nicht daran, dass LIMIT
selbst hat eine hohe Startzeit. Es hat eigentlich keine Startzeit von selbst, aber EXPLAIN
rollt alle Kinderkosten für jeden Elternteil zusammen, also das LIMIT
Die Startzeit enthält die Summe der Startzeiten ihrer Kinder.
Diese Aufsummierung der Kosten kann es schwierig machen, die Ausführungskosten jeder einzelnen Komponente zu verstehen. Zum Beispiel unser LIMIT
hat keine Startzeit, aber das ist nicht auf den ersten Blick ersichtlich. Aus diesem Grund haben mehrere andere Personen mit „explain.depesz.com“ verlinkt, einem von Hubert Lubaczewski (alias depesz) erstellten Tool, das beim Verständnis von EXPLAIN
hilft B. durch Subtrahieren der Kinderkosten von den Elternkosten. Er erwähnt einige andere Komplexitäten in einem kurzen Blogbeitrag über sein Tool.