Dieser Artikel wurde von der Huawei Cloud Community „ GaussDB (DWS) Vectorized Execution Engine Detaillierte Erklärung “ geteilt, Autor: yd_212508532.
Vorwort
- Anwendbare Version: [Basisfunktion]
Die meisten herkömmlichen Zeilenausführungs-Engines verwenden einen Einzel-Tupel-Ausführungsmodus. Auf diese Weise wird die CPU die meiste Zeit während des Ausführungsprozesses nicht zum Verarbeiten von Daten verwendet, sondern eher zum Durchlaufen des Ausführungsbaums führt zu einer geringen effektiven Auslastung der CPU. Angesichts einer großen Anzahl von Funktionsaufrufen in OLAP-Szenarien ist ein enormer Overhead erforderlich. Um dieses Problem zu lösen, wurde GaussDB (DWS) eine Vektorisierungs-Engine hinzugefügt. Die Vektorisierungs-Engine verwendet einen Batch-zu-Zeit-Ausführungsmodus für Tupel, wodurch die Kosten für das Durchlaufen von Ausführungsknoten erheblich gesenkt werden können. Gleichzeitig ist die Vektorisierungs-Engine natürlich auch mit dem Spaltenspeicher verbunden, was das Laden vektorisierter Spaltendaten in die zugrunde liegenden Scanknoten erleichtert. Spaltenspeicher + vektorisierte Ausführungs-Engine ist einer der goldenen Schlüssel, der die Tür zur OLAP-Leistung öffnet!
Informationen zu Zeilenspeicher- und Spaltenspeichertabellen
Die Zeilenspeichertabelle speichert Tupel zeilenweise in Seiten. Es wird hauptsächlich in TP-Szenarien verwendet, in denen die Daten häufig aktualisiert werden, viele Hinzufügungen, Löschungen und Änderungen vorgenommen werden und die Abfrageergebnisse mehrere Spalten der Tabelle umfassen.
Spaltenspeichertabellen werden in Spalten gespeichert und die Daten jeder Spalte werden in einer Datei gespeichert. Wird hauptsächlich in AP-Szenarien verwendet.
- Die Anzahl der Tabellenspalten ist groß, die Anzahl der Spalten, auf die zugegriffen wird, ist gering und die Anzahl der E/A-Vorgänge wird reduziert.
- Die Spaltendaten sind homogen, was das Datenkomprimierungsverhältnis verbessert
- Bei Vorgängen, die auf Spaltenstapeldaten basieren, ist die Trefferquote im CPU-Cache hoch
Ausführungsrahmen
Der Executor ist der Knotenpunkt der Interaktion zwischen dem Optimierer und der Speicher-Engine. Unter Verwendung des vom Optimierer generierten Ausführungsplanbaums als Eingabe greift die Speicher-Engine auf die Daten zu und führt verschiedene Ausführungsoperatoren gemäß dem Plan aus, um die Datenverarbeitung zu realisieren. Im Pipeline-Modus bearbeitet der Zeilen-Executor jeweils ein Tupel und der Spalten-Executor jeweils einen Batch. Die obere Schicht steuert die untere Schicht und ermöglicht den Datenfluss im Ausführungsbaum nach oben. Stellt Ausführungsoperatoren für verschiedene Datenverarbeitungen bereit. Die folgende Abbildung zeigt den Top-Down-Kontrollfluss und den Bottom-Up-Datenfluss.
Der Ausführungsprozess des Testamentsvollstreckers kann in diese drei Schritte unterteilt werden:
- Initialisierung des Executors: Erstellen Sie den globalen Statusinformationsbestand des Executors, durchlaufen Sie rekursiv jeden Knoten des Planbaums und initialisieren Sie seinen Ausführungsstatusinformationsplanstatus
- Ausführung des Executors: Die Eingänge der Zeilen-Engine und der Vektorisierungs-Engine sind unabhängig. Ausgehend vom Wurzelknoten des Planbaums wird rekursiv zu den Blattknoten übergegangen, um nach der schichtweisen Verarbeitung ein Tupel/Batch zu erhalten Bei Knotenoperatoren wird ein Ergebnis-Tupel/-Batch zurückgegeben, bis kein Tupel/Batch mehr vorhanden ist.
- Bereinigen des Executors: Recyceln Sie die globalen Statusinformationen des Executors und bereinigen Sie den Ausführungsstatus jedes Planknotens.
Kolumnenausführender
Das Problem mit dem Zeilen-Executor besteht darin, dass der Großteil der CPU-Verarbeitung im Prozess des Durchlaufens des Planbaums stattfindet, anstatt die Daten tatsächlich zu verarbeiten, und die effektive CPU-Auslastung gering ist. Die einzigartigen Anwendungsszenarien von Spaltenspeichertabellen erfordern eine unterstützende Vektorisierungs-Engine, um die Leistungsverbesserung in OLAP-Szenarien wirklich nutzen zu können. Daher besteht die Grundidee der Transformation des Spalten-Executors darin, jeweils eine Datenspalte zu verarbeiten.
Wie der Zeilen-Executor folgt der vektorisierte Ausführungs-Engine-Scheduler dem Pipeline-Modus, aber jede Verarbeitung und Datenübertragung zwischen Operatoren erfolgt stapelweise (d. h. 1000 Datenzeilen), was die CPU-Trefferquote verbessert und E/A-Lesevorgänge reduziert . Die Datenflussstruktur des Spaltenexekutors VectorBatch ist in der folgenden Abbildung dargestellt.
Zeilen und Spalten mischen: Adapteroperator
Einige Szenarien von Spaltenspeichertabellen unterstützen keine vektorisierten Ausführungs-Engines, z. B. string_to_array, listagg, string_agg usw.
GaussDB verfügt über die Möglichkeit, automatisch zwischen zwei Sätzen von Zeilen- und Spalten-Engines zu wechseln.
Wenn für Spaltenspeicherdaten nur eine Zeilen-Engine vorhanden ist, müssen die Spaltendaten normalerweise in Tupel rekonstruiert werden, damit die Ausführungs-Engine Zeile für Zeile verarbeiten kann. Der Tuple-Deformationsprozess wirkt sich auf die Leistung der Verarbeitung von Spaltenspeicherdatenabfragen aus.
Leistung der vektorisierten Ausführungs-Engine
Wenn wir die Berechnungsleistung des gleichen Ausdrucks x*(1-y) durch die Zeilen- und Spaltenspeicher-Engine vergleichen, können wir sehen, dass der Cstore Scan-Operator der Spaltenspeicher-Engine 85 % weniger Zeit benötigt als der Seq Scan-Operator der Zeilenspeicherung Motor.
Die Merkmale der Vektorberechnung sind: Berechnung mehrerer Werte gleichzeitig, Reduzierung von Funktionsaufrufen und Kontextwechseln sowie vollständige Nutzung des CPU-Cache und vektorisierter Ausführungsanweisungen zur Verbesserung der Leistung.
Leistungsvorteile vektorisierter Ausführungs-Engines:
- Lesen Sie stapelweise mehr Daten und reduzieren Sie die Anzahl der E/A-Lesevorgänge
- Aufgrund der großen Anzahl von Datensätzen im Batch steigt die Cache-Trefferrate der entsprechenden CPU.
- Die Anzahl der Funktionsaufrufe während der Ausführung im Pipeline-Modus wird reduziert.
- Wird mit Spaltenspeichertabellen abgeglichen, um die Tupelverformung zu reduzieren, d. h. den Zeitaufwand für die Rekonstruktion von Tupeln aus Spaltenspeicherdaten
Vergleich der Operatoren von Zeilen-/Spaltenausführern
Die Ausführungsoperatoren der Vektorisierungs-Engine ähneln denen der Zeilenausführungs-Engine und umfassen Kontrolloperatoren, Scanoperatoren, Materialisierungsoperatoren und Verbindungsoperatoren. Es wird auch durch Knoten dargestellt, die von Zeilenausführungsknoten geerbt werden, und der Ausführungsprozess ist rekursiv. Die wichtigsten enthaltenen Knoten sind: CStoreScan (sequentieller Scan), CStoreIndexScan (Index-Scan), CStoreIndexHeapScan (Verwendung von Bitmap zum Erhalten von Tupeln), VecMaterial (Materialisierung), VecSort (Sortierung), VecHashJoin (vektorisierte Hash-Verbindung) usw Im Folgenden werden diese Ausführungsoperatoren einzeln vorgestellt.
Scan-Operator
Der Scan-Operator wird zum Scannen der Daten in der Tabelle verwendet. Jedes Mal, wenn er ein Tupel als Eingabe des oberen Knotens erhält, ist es im Blattknoten des Abfrageplanbaums vorhanden. Es kann nicht nur die Tabelle scannen, sondern auch Scannen Sie die Ergebnismenge der Funktion, die verknüpfte Listenstruktur und die untergeordnete Abfrageergebnismenge. Einige der gebräuchlichsten Scan-Operatoren sind in der Tabelle aufgeführt.
Operator (Zeilen-/Spaltenspeicheroperator) | Bedeutung | Szene erscheinen |
---|---|---|
SeqScan/CStoreScan | Sequentielles Scannen | Der einfachste Scan-Operator, der zum Scannen physischer Tabellen verwendet wird (sequentieller Scan ohne Indexunterstützung). |
IndexScan/CStoreIndexScan | Index-Scan | Es wird ein Index zu den Attributen erstellt, die an den Auswahlkriterien beteiligt sind |
IndexOnlyScan/CStoreIndexOnlyScan | Tupel direkt vom Index zurückgeben | Indexspalten decken Ergebnissatzspalten vollständig ab |
BitmapScan(BitmapIndexScan, BitmapHeapScan) / CStoreIndexHeapScan (CStoreIndexAnd, CStoreIndexOr,CStoreIndexCtidScan) | Verwenden Sie Bitmap, um Tupel zu erhalten | BitmapIndexScan verwendet den Index des zu scannenden Attributs und gibt das Ergebnis als Bitmap zurück. BitmapHeapScan ruft das Tupel aus der Bitmap-Ausgabe von BitmapIndexScan ab |
TidScan | Holen Sie sich Tupel für Tupel | 1.WHERE-Bedingungen (wie CTID = tid oder CTID IN (tid1, tid2, …)) ;2.UPDATE/DELETE … WHERE CURRENT OF Cursor |
SubqueryScan/VecSubqueryScan | Unterabfrage-Scan | Verwenden Sie einen anderen Abfrageplanbaum (Unterplan) als Scanobjekt zum Scannen von Tupeln |
FunctionScan | Funktionsscan | VON Funktionsname |
WerteScan | Scannen Sie die verknüpfte Werteliste | Durchsuchen Sie die durch die VALUES-Klausel angegebene Sammlung von Tupeln |
ForeignScan/VecForeignScan | Externer Tabellenscan | Externe Tabelle abfragen |
CteScan/VecCteScan | CTE-Tabellenscan | Durchsuchen Sie Unterabfragen, die mit der WITH-Klausel in einer SELECT-Abfrage definiert sind |
Verbindungsbetreiber
Der Join-Operator entspricht der Join-Operation in der relationalen Algebra. Am Beispiel von Tabelle t1 Join t2 sind die wichtigsten zentralisierten Join-Typen wie folgt: Inner Join, Left Join, Right Join, Full Join, Semi Join, Anti Join usw Zu den Implementierungsmethoden gehören Nestloop, HashJoin und MergeJoin .
Operator (Zeilen-/Spaltenspeicheroperator) | Bedeutung | Szene erscheinen |
---|---|---|
NestLoop/VecNestLoop | Verschachtelte Schleifenverbindung, gewalttätige Verbindung, durchsuchen Sie die interne Tabelle nach jeder Zeile | Innerer Join, linker äußerer Join, Semi-Join, Anti-Join |
MergeJoin/VecMergeJoin | Verbindung zusammenführen (Eingabereihenfolge), Sortieren der inneren und äußeren Tabellen, Positionieren des ersten und letzten Endes und gleichzeitiges Verbinden von Tupeln. Equijoin | Innerer Join, linker äußerer Join, rechter äußerer Join, vollständiger äußerer Join, Semi-Join, Anti-Join |
HashJoin/VecHashjoin | Hash-Join: Die innere und die äußere Tabelle verwenden den Hash-Wert der Join-Spalte, um eine Hash-Tabelle zu erstellen, und dieselben Werte müssen sich im selben Hash-Bucket befinden. Equijoin | Innerer Join, linker äußerer Join, rechter äußerer Join, vollständiger äußerer Join, Semi-Join, Anti-Join |
Materialisierungsoperator
Materialisierte Operatoren sind eine Art Knoten, der Tupel zwischenspeichern kann. Während der Ausführung müssen viele erweiterte physische Operatoren zunächst alle Tupel abrufen, bevor sie ausgeführt werden können (z. B. Aggregatfunktionsoperationen, Sortieren ohne Indexunterstützung usw.). Dies erfordert die Verwendung von Materialisierungsoperatoren zum Zwischenspeichern der Tupel.
Operator (Zeilen-/Spaltenspeicheroperator) | Bedeutung | Szene erscheinen |
---|---|---|
Material/VecMaterial | materialisieren | Ergebnisse des untergeordneten Knotens zwischenspeichern |
Sortieren/VecSort | Sortieren | ORDER BY-Klausel, Verbindungsoperation, Gruppierungsoperation, Mengenoperation, mit Unique |
Gruppe/VecGroup | Gruppierungsvorgänge | Untergeordnete Klausel GROUP BY |
Agg/VecAggregation | Aggregatfunktion ausführen | 1. Aggregationsfunktionen wie COUNT/SUM/AVG/MAX/MIN; 2. DISTINCT-Klausel; 3. UNION zum Entfernen von Duplikaten; |
WindowAgg/VecWindowAgg | Fensterfunktion | WINDOW-Klausel |
Einzigartig/VecUnique | Deduplizierung (die untere Ebene wurde sortiert) | 1. DISTINCT-Klausel; 2. UNION-Deduplizierung |
Hash | HashJoin-Hilfsknoten | Erstellen Sie eine Hash-Tabelle und arbeiten Sie mit HashJoin zusammen |
SetOp/VecSetOp | Abwicklung von Inkassovorgängen | INTERSECT/INTERSECT ALL, AUßER/AUSSER ALLE |
LockRows | Umgang mit Sperren auf Zeilenebene | WÄHLEN … ZUM TEILEN/AKTUALISIEREN |
Kontrolloperator
Kontrolloperatoren sind eine Art Knoten, der zur Behandlung spezieller Situationen und zur Implementierung spezieller Ausführungsprozesse verwendet wird.
Operator (Zeilen-/Spaltenspeicheroperator) | Bedeutung | Szene erscheinen |
---|---|---|
Ergebnis/VecResult | Direkt berechnen | 1. Enthält keinen Tabellenscan. 2. Es gibt nur eine VALUES-Klausel in der INSERT-Anweisung. 3. Wenn Append/MergeAppend der Plan-Wurzelknoten ist (Projektions-Push-up). |
Tabelle ändern | INSERT/UPDATE/DELETE oberer Knoten | EINFÜGEN/AKTUALISIEREN/LÖSCHEN |
Anhängen/VecAppend | Zusatz | 1. UNION(ALL); 2. Vererbungstabelle |
MergeAppend | Anhängen (Eingabe geordnet) | 1. UNION(ALL); 2. Vererbungstabelle |
RecursiveUnion | Rekursive Behandlung von UNION-Unterabfragen, die in der WITH-Klausel definiert sind | WITH RECURSIVE … SELECT …-Anweisung |
BitmapUnd | Logische Bitmap-UND-Verknüpfung | BitmapScan für mehrdimensionales Indexscannen |
BitmapOr | Logische Bitmap-ODER-Operation | BitmapScan für mehrdimensionales Indexscannen |
Limit/VecLimit | Umgang mit LIMIT-Klauseln | OFFSET … GRENZE … |
Andere Betreiber
Zu den weiteren Operatoren gehören Stream-Operatoren und Operatoren wie RemoteQuery
Operator (Zeilen-/Spaltenspeicheroperator) | Bedeutung | Szene erscheinen |
---|---|---|
Strom | Datenaustausch mit mehreren Knoten | Führen Sie einen verteilten Abfrageplan aus, und es findet ein Datenaustausch zwischen Knoten statt |
Partitionsiterator | Partitionierter Iterator | Scannen Sie die Partitionstabelle und scannen Sie jede Partition iterativ |
VecToRow/RowToVec | Spalte zu Zeile/Zeile zu Spalte | Gemischte Szene aus Dienstgraden und Dienstgraden |
DfsScan / DfsIndexScan | HDFS-Tabellen-(Index-)Scan | HDFS-Tabellenscan |
Die Entwicklung der Gaussdb-Vektorisierung
Nach der Vektorisierungs-Engine der ersten Generation entwickelte GaussDB Vektorisierungs-Engines mit höherer Leistung: Sonic-Vektorisierungs-Engine und Turbo-Vektorisierungs-Engine.
Um die OLAP-Ausführungsleistung zu verbessern, entwickelt sich GaussDB auf dem Weg der Spaltenspeicherung + der vektorisierten Ausführungs-Engine und der Stapelberechnung weiter:
- Stream-Operator + Framework für verteilte Ausführung unterstützt den Datenfluss zwischen mehreren Knoten
- SMP, Multi-Thread-Parallelität innerhalb des Knotens, vollständige Nutzung ungenutzter Hardware-Ressourcen
- Die LLVM-Technologie, ein neues Framework zur Codegenerierung und ein JIT-Compiler (Just-in-Time), beseitigt Engpässe bei der Tupelverformung
- Die Sonic-Vektorisierungs-Engine vektorisiert die Operatoren HashAgg und HashJoin weiter und implementiert verschiedene Arrays, um Daten entsprechend den unterschiedlichen Typen jeder Spalte zu berechnen.
- Die Turbo-Vektorisierungs-Engine der neuen Generation vektorisiert die meisten Operatoren weiter. Basierend auf der Sonic-Engine werden Nulloptimierung, große Ganzzahloptimierung, Stream-Optimierung, Sortieroptimierung usw. hinzugefügt, um die Leistung weiter zu verbessern.
Zusammenfassen
In diesem Artikel wird die vektorisierte Ausführungs-Engine von GaussDB vorgestellt und ihr Framework, ihre Prinzipien, ein Überblick über die einzelnen Operatoren und die Leistungsverbesserung erläutert.
Ich habe beschlossen, Open-Source-Hongmeng aufzugeben . Wang Chenglu, der Vater von Open-Source-Hongmeng: Open-Source-Hongmeng ist die einzige Architekturinnovations- Industriesoftwareveranstaltung im Bereich Basissoftware in China – OGG 1.0 wird veröffentlicht, Huawei steuert den gesamten Quellcode bei Google Reader wird vom „Code-Scheißberg“ getötet Fedora Linux 40 wird offiziell veröffentlicht Ehemaliger Microsoft-Entwickler: Windows 11-Leistung ist „lächerlich schlecht“ Ma Huateng und Zhou Hongyi geben sich die Hand, um „Groll zu beseitigen“ Namhafte Spielefirmen haben neue Vorschriften erlassen : Hochzeitsgeschenke für Mitarbeiter dürfen 100.000 Yuan nicht überschreiten Ubuntu 24.04 LTS offiziell veröffentlicht Pinduoduo wurde wegen unlauteren Wettbewerbs zu einer Entschädigung von 5 Millionen Yuan verurteilt