Frage

MySQL erklärt Ausgang ist ziemlich einfach. PostgreSQL ist ein wenig komplizierter. Ich habe nicht in der Lage gewesen, eine gute Ressource zu finden, die es entweder erklärt.

Können Sie beschreiben, was genau erklären zu sagen hat oder zumindest zeigen Sie mir in die Richtung einer guten Ressource?

War es hilfreich?

Lösung

Explaining_EXPLAIN.pdf könnte auch helfen.

Andere Tipps

Der Teil habe ich immer gefunden verwirrend ist die Anlaufkosten vs Gesamtkosten. I Google dies jedes Mal, wenn ich es vergessen, was mich hier zurückbringt, die nicht den Unterschied nicht erklären, weshalb ich diese Antwort hier schreibe. Dies ist, was ich von der Postgres EXPLAIN Dokumentation aufgelesen haben, < strong> erklärt, wie ich es.

Hier ist ein Beispiel von 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:

 grafische Erklärung der ersten Abfrage

(Wenn Sie PgAdmin verwenden, Sie mit der Maus auf eine Komponente verweisen können die Kosten Details zu lesen.)

Die Kosten werden als Tupel, z.B. die Kosten der LIMIT cost=0.00..3.39 ist und die Kosten des sequenziellen Abtastung post cost=0.00..15629.12 ist. Die erste Zahl in dem Tupel der Start Kosten und die zweite Zahl ist die Gesamtkosten . Weil ich EXPLAIN verwendet und nicht EXPLAIN ANALYZE, diese Kosten sind Schätzungen nicht unbedingt Maßnahmen.

  • Startup Kosten ist ein schwieriges Konzept. Es ist nicht nur die Höhe der Zeit darstellen, bevor diese Komponente startet . Es stellt die Menge an Zeit zwischen, wenn die Komponente beginnt mit der Ausführung (in Lesen von Daten), und wenn die Komponente gibt seine erste Reihe .
  • Gesamtkosten ist die gesamte Ausführungszeit der Komponente aus, wenn es beginnt in Daten zu lesen, wenn es beendet seine Ausgabe schreibt.

Als Komplikation, die jeweils „Eltern“ Knotens Kosten beinhalten die Kosten der untergeordneten Knoten. In der Textdarstellung wird der Baum durch Einrückung dargestellt, z.B. LIMIT ist ein Elternknoten und Seq Scan ist sein Kind. In der PgAdmin Darstellung zeigen die Pfeile von Kind zu Eltern - die Richtung des Datenflusses -., Die nicht eingängig sein könnten, wenn Sie mit der Graphentheorie vertraut sind

Die Dokumentation sagt, dass die Kosten inklusive aller untergeordneten Knoten sind, aber feststellen, dass die Gesamtkosten der Mutter 3.39 ist viel kleiner als die Gesamtkosten für das Kind 15629.12 ist. Die Gesamtkosten sind nicht inklusive, weil eine Komponente wie LIMIT nicht brauchen, um ihre gesamte Eingabe zu verarbeiten. Siehe das EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND unique2 > 9000 LIMIT 2; Beispiel in Postgres EXPLAIN Dokumentation .

In dem obigen Beispiel ist die Startzeit Null für beide Komponenten, da weder Komponente eine Verarbeitung tun muss, bevor es Zeilen beginnt zu schreiben: ein sequentielles Scannen liest die erste Zeile der Tabelle und gibt es. Die LIMIT liest seine erste Reihe und dann gibt sie.

Wenn wäre eine Komponente benötigt viel Verarbeitung zu tun, bevor es zur Ausgabe aller Zeilen beginnen kann? Es gibt viele mögliche Gründe, aber sie an einem klaren Beispiel. Hier ist die gleiche Abfrage aus der Zeit vor, aber jetzt eine ORDER BY Klausel enthalten:

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:

 graphische Erläuterung der zweiten Abfrage

Wieder einmal hat die sequentielle Scan post keine Startkosten: es beginnt Zeilen sofort ausgibt. Aber die Art hat eine erhebliche 23283.24 Start Kosten, weil es zu die gesamte Tabelle sortieren, bevor er ausgeben kann auch nur eine einzige Zeile . Die Gesamtkosten der Art 23859.27 ist nur geringfügig höher als die Startkosten, was die Tatsache widerspiegelt, dass, sobald die gesamten Datensatz sortiert wurde, können die sortierten Daten sehr emittiert werdenschnell.

Beachten Sie, dass die Startzeit des LIMIT 23283.24 zu der Startzeit der Art genau gleich ist. Dies ist nicht, weil LIMIT selbst eine hohe Anlaufzeit hat. Es hat tatsächlich Null Startzeit von selbst, sondern EXPLAIN rollt für jeden Elternteil alle der Kinderkosten, also die LIMIT Startzeit enthält die Summe Startzeiten ihrer Kinder.

Dieses Rollup der Kosten kann es schwierig machen, die Ausführungskosten jeder einzelnen Komponente zu verstehen. Zum Beispiel unsere LIMIT hat null Startzeit, aber das ist auf den ersten Blick nicht offensichtlich. Aus diesem Grund mehrere andere Personen im Zusammenhang mit explain.depesz.com , ein Werkzeug von Hubert Lubaczewski erstellt (aka depesz ), die durch verstehen EXPLAIN hilft - unter anderem - Subtrahieren Kind Kosten von den Eltern Kosten. Er erwähnt einige andere Komplexitäten in einem kurzen Blog-Post über sein Werkzeug.

Sie führt von gegliedersten zu mindestens gegliederten, und ich von der Unterseite des Plans an die Spitze glaube. (Wenn es also zwei eingekerbten Abschnitte sind, die man weiter unten auf der Seite führt zuerst, dann, wenn sie die anderen ausführt treffen, dann ist die Regel verbinden sie ausführt.)

Die Idee ist, dass es bei jedem Schritt 1 oder 2 sind Datensätze, die durch eine Regel verarbeitet kommen und gehen. Wenn nur ein Datensatz ist, dass der Betrieb in diesem Datensatz durchgeführt. (Zum Beispiel scannen ein Index, um herauszufinden, welche Zeilen Sie wollen, filtern, um einen Datensatz oder sortieren.) Wenn zwei, die beiden Datensätze sind die beiden Dinge, die weiter vertieft werden, und sie werden von der Regel, die Sie sehen, verbunden. Die Bedeutung der meisten Regeln vernünftigerweise leicht erraten (insbesondere, wenn Sie ein paar Pläne zu erklären, bevor gelesen haben), aber können Sie versuchen, einzelne Elemente zu überprüfen, indem sie entweder in der Dokumentation suchen oder (einfacher) nur um den Satz zu werfen in Google zusammen mit ein paar Schlüsselwörter wie EXPLAIN.

Das ist natürlich keine vollständige Erklärung, aber es gibt genug Kontext, dass Sie in der Regel herausfinden können, was Sie wollen. Zum Beispiel betrachtet diesen Plan von einer tatsächlichen Datenbank:

explain analyze
select a.attributeid, a.attributevalue, b.productid
from orderitemattribute a, orderitem b
where a.orderid = b.orderid
and a.attributeid = 'display-album'
and b.productid = 'ModernBook';

------------------------------------------------------------------------------------------------------------------------------------------------------------

 Merge Join  (cost=125379.14..125775.12 rows=3311 width=29) (actual time=841.478..841.478 rows=0 loops=1)
   Merge Cond: (a.orderid = b.orderid)
   ->  Sort  (cost=109737.32..109881.89 rows=57828 width=23) (actual time=736.163..774.475 rows=16815 loops=1)
         Sort Key: a.orderid
         Sort Method:  quicksort  Memory: 1695kB
         ->  Bitmap Heap Scan on orderitemattribute a  (cost=1286.88..105163.27 rows=57828 width=23) (actual time=41.536..612.731 rows=16815 loops=1)
               Recheck Cond: ((attributeid)::text = 'display-album'::text)
               ->  Bitmap Index Scan on (cost=0.00..1272.43 rows=57828 width=0) (actual time=25.033..25.033 rows=16815 loops=1)
                     Index Cond: ((attributeid)::text = 'display-album'::text)
   ->  Sort  (cost=15641.81..15678.73 rows=14769 width=14) (actual time=14.471..16.898 rows=1109 loops=1)
         Sort Key: b.orderid
         Sort Method:  quicksort  Memory: 76kB
         ->  Bitmap Heap Scan on orderitem b  (cost=310.96..14619.03 rows=14769 width=14) (actual time=1.865..8.480 rows=1114 loops=1)
               Recheck Cond: ((productid)::text = 'ModernBook'::text)
               ->  Bitmap Index Scan on id_orderitem_productid  (cost=0.00..307.27 rows=14769 width=0) (actual time=1.431..1.431 rows=1114 loops=1)
                     Index Cond: ((productid)::text = 'ModernBook'::text)
 Total runtime: 842.134 ms
(17 rows)

Versuchen Sie es selbst zu lesen und sehen, ob es Sinn macht.

Was ich lese ist, dass die Datenbank zuerst die id_orderitem_productid Index durchsucht, dass die Zeilen zu finden, indem es aus orderitem will, dann sortiert, die eine quicksort Dataset (die Sortierung verwendet wird sich ändern, wenn die Daten passt nicht in RAM), dann setzt das beiseite.

Als nächstes scannt orditematt_attributeid_idx die Zeilen aus orderitemattribute will zu finden und dann sortiert, die ein quicksort Datensatz mit.

Es dauert dann die beiden Datensätze und fügt sie zusammen. (A Mergeverknüpfung ist eine Art von „Schwirren“ -Operation, wo es geht, die beiden Datensätze sortiert in parallelen, Emittieren der Reihe verbunden, wenn sie übereinstimmen.)

Wie gesagt, Sie arbeiten durch den Plan Innenteil Außenteil, von unten nach oben.

Es ist ein Online-Helfer-Tool zur Verfügung zu haben, Depesz , das wird aufzeigen, wo die teuren Teile der Analyse Ergebnisse sind.

hat auch ein, hier ist der gleichen Ergebnisse , die mir deutlicher, wo das Problem machen ist.

PgAdmin zeigt Ihnen eine grafische Darstellung des Plans erklären. Das Hin- und Herschalten zwischen den beiden kann man wirklich helfen, zu verstehen, was die Textdarstellung bedeutet. Wenn Sie jedoch wollen nur wissen, was es todo wird, können Sie in der Lage sein, nur immer die GUI zu verwenden.

PostgreSQLs offizielle Dokumentation bietet eine interessante, ausführliche Erklärung auf, wie die Ausgabe der verstehen, zu erklären, .

Wenn Sie pgAdmin installieren, gibt es eine Taste erklären, dass auch die Textausgabe geben zeichnet Diagramme von dem, was passiert, die Filter zeigt, sortiert und Untersatz übergeht, dass ich wirklich nützlich finden, um zu sehen, was passiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top