Detaillierte Erläuterung der vektorisierten Ausführungs-Engine des Data Warehouse

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.

Speichermethode für Zeilenspeichertabellen

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

Speichermethode für Spaltenspeichertabellen

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.

Pipeline-Modus des Executors

Der Ausführungsprozess des Testamentsvollstreckers kann in diese drei Schritte unterteilt werden:

  1. Initialisierung des Executors: Erstellen Sie den globalen Statusinformationsbestand des Executors, durchlaufen Sie rekursiv jeden Knoten des Planbaums und initialisieren Sie seinen Ausführungsstatusinformationsplanstatus
  2. 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.
  3. Bereinigen des Executors: Recyceln Sie die globalen Statusinformationen des Executors und bereinigen Sie den Ausführungsstatus jedes Planknotens.

Der Ausführungsprozess des Testamentsvollstreckers

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.

Column Executor-Datenflussstruktur VectorBatch

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.

Automatische Umschaltung von Zeilen- und Spalten-Engines

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.

Leistungsvergleich der Zeilen-/Spalten-Engine

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.

 

Klicken Sie hier, um zu folgen und so schnell wie möglich mehr über die neuen Technologien von Huawei Cloud zu erfahren~

 

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
{{o.name}}
{{m.name}}

Ich denke du magst

Origin my.oschina.net/u/4526289/blog/11054711
Empfohlen
Rangfolge