Backend-Flussdiagramm

Klicken Sie auf einen Eintrag, um weitere Details anzuzeigen oder den vollständigen Index anzusehen.

flowchart main postmaster tcop parser tcop rewrite path plan executor libpq tcop commands utils catalog storage access nodes


Eine Anfrage kommt über Datenpakete, die über TCP/IP oder Unix Domain Sockets an das Backend gesendet werden. Sie wird in einen String geladen und an den Parser übergeben, wo der lexikalische Scanner, scan.l, die Anfrage in Tokens (Wörter) zerlegt. Der Parser verwendet gram.y und die Tokens, um den Anfragetyp zu identifizieren und die entsprechende typspezifische Struktur zu laden, wie z.B. CreateStmt oder SelectStmt.

Die Anweisung wird dann als komplex (SELECT / INSERT / UPDATE / DELETE) oder einfach, z.B. CREATE ROLE, ANALYZE, usw., identifiziert. Einfache Utility-Befehle, die den Executor nicht benötigen, werden durch typspezifische Funktionen im commands-Modul verarbeitet. Komplexe Anweisungen erfordern eine weitere Bearbeitung.

Der Parser nimmt eine komplexe Anfrage entgegen und erstellt eine Query-Struktur, die alle Elemente enthält, die von komplexen Anfragen verwendet werden. Query.jointree enthält die FROM- und WHERE-Klauseln, die von transformFromClause() und transformWhereClause() gefüllt werden. Jede in der Anfrage referenzierte Tabelle wird durch einen RangeTblEntry dargestellt und miteinander verbunden, um die Range Table der Anfrage zu bilden, die von transformFromClause() generiert wird. Query.rtable enthält die Range Table der Anfrage.

Bestimmte Anfragen, wie z.B. SELECT, geben Datenspalten zurück. Andere Anfragen, wie z.B. INSERT und UPDATE, geben die durch die Anfrage geänderten Spalten an. Diese Spaltenreferenzen werden in TargetEntry-Einträge konvertiert, die miteinander verbunden werden, um die Target List der Anfrage zu bilden. Die Target List wird in Query.targetList gespeichert, die von transformTargetList() generiert wird.

Andere Anfrageelemente, wie z.B. Aggregationen (SUM()), GROUP BY und ORDER BY, werden ebenfalls in ihren eigenen Query-Feldern gespeichert.

Der nächste Schritt besteht darin, dass die Query durch alle VIEWS oder RULES modifiziert wird, die möglicherweise für die Query gelten. Dies wird durch das rewrite-System durchgeführt.

Der Optimizer verwendet die Query-Struktur, um die beste Tabellenverbindungsreihenfolge und den Verbindungstyp für jede Tabelle in der RangeTable zu bestimmen, wobei Query.jointree (FROM- und WHERE-Klauseln) berücksichtigt wird, um eine optimale Indexverwendung zu erzielen.

Das path-Modul generiert dann einen optimalen Plan, der die auszuführenden Operationen zur Ausführung der Anfrage enthält.

Der Plan wird dann zur Ausführung an den Executor übergeben, und das Ergebnis an den Client zurückgegeben. Der Plan ist tatsächlich eine Menge von Knoten, die in einer Baumstruktur mit einem obersten Knoten und verschiedenen Unterknoten als Kinder angeordnet sind.

Es gibt viele andere Module, die diese grundlegende Funktionalität unterstützen. Sie können durch Klicken auf das Flussdiagramm aufgerufen werden.