Explication détaillée du moteur d'exécution vectoriel de l'entrepôt de données

Cet article est partagé par la communauté Huawei Cloud « Explication détaillée du moteur d'exécution vectoriel GaussDB (DWS) , auteur : yd_212508532.

Préface

  • Version applicable : [Fonction de base]

La plupart des moteurs d'exécution de lignes traditionnels adoptent un mode d'exécution un tuple à la fois. De cette manière, la plupart du temps pendant le processus d'exécution, le processeur n'est pas utilisé pour traiter les données, mais plutôt pour parcourir l'arborescence d'exécution, ce qui est le cas pour les moteurs d'exécution de ligne traditionnels. entraînera une faible utilisation efficace du processeur. Face à un grand nombre d’appels de fonctions dans les scénarios OLAP, une surcharge considérable est nécessaire. Afin de résoudre ce problème, un moteur de vectorisation a été ajouté à GaussDB (DWS). Le moteur de vectorisation utilise un mode d'exécution de tuples par lots, ce qui peut réduire considérablement le coût de traversée des nœuds d'exécution. Dans le même temps, le moteur de vectorisation est également naturellement connecté au stockage de colonnes, ce qui facilite le chargement des données de colonnes vectorisées dans les nœuds d'analyse sous-jacents. Le stockage en colonnes + le moteur d’exécution vectorisé sont l’une des clés d’or qui ouvre la porte aux performances OLAP !

À propos des tables de stockage de lignes et de colonnes

La table de stockage de lignes stocke les tuples dans les pages Page par lignes. Il est principalement utilisé dans les scénarios TP où les données sont fréquemment mises à jour, il y a de nombreux ajouts, suppressions et modifications, et les résultats de la requête impliquent plusieurs colonnes de la table.

Méthode de stockage de table de stockage de lignes

Les tables de stockage de colonnes sont stockées dans des colonnes et les données de chaque colonne sont stockées dans un fichier. Principalement utilisé dans les scénarios AP.

  • Le nombre de colonnes de la table est grand, le nombre de colonnes consultées est petit et le nombre d'opérations d'E/S est réduit.
  • Les données des colonnes sont homogènes, ce qui améliore le taux de compression des données
  • Opérations basées sur des données par lots de colonnes, le taux de réussite du cache CPU est élevé

Méthode de stockage de table de stockage de colonnes

cadre d'exécution

L'exécuteur est la plaque tournante de l'interaction entre l'optimiseur et le moteur de stockage. En prenant comme entrée l'arborescence du plan d'exécution générée par l'optimiseur, les données sont accessibles à partir du moteur de stockage et divers opérateurs d'exécution sont exploités conformément au plan pour réaliser le traitement des données. En mode Pipeline, l’exécuteur de lignes opère un tuple à la fois et l’exécuteur de colonnes opère un lot à la fois. La couche supérieure pilote la couche inférieure, permettant aux données de remonter dans l'arborescence d'exécution. Fournit des opérateurs d’exécution pour divers traitements de données. La figure ci-dessous montre le flux de contrôle descendant et le flux de données ascendant.

Mode pipeline de l'exécuteur

Le processus d’exécution de l’exécuteur peut être divisé en trois étapes :

  1. Initialisation de l'exécuteur : construire le domaine d'informations sur l'état global de l'exécuteur, parcourir de manière récursive chaque nœud de l'arborescence du plan et initialiser ses informations sur l'état d'exécution planstate
  2. Exécution de l'exécuteur : Les entrées du moteur ligne et du moteur de vectorisation sont indépendantes. Partant du nœud racine de l'arbre plan, il parcourt récursivement jusqu'aux nœuds feuilles pour obtenir un tuple/batch après traitement par couche. opérateurs de nœuds, un tuple/batch de résultat est renvoyé jusqu'à ce qu'il n'y ait plus de tuple/batch.
  3. Nettoyage de l'exécuteur : recyclez les informations d'état globales de l'exécuteur et nettoyez l'état d'exécution de chaque nœud du plan.

Le processus d'exécution de l'exécuteur testamentaire

exécuteur de colonne

Le problème avec l'exécuteur de lignes est que la majeure partie du traitement du processeur est en train de parcourir l'arborescence du plan au lieu de traiter réellement les données, et que l'utilisation effective du processeur est faible. Les scénarios d'application uniques des tables de stockage de colonnes nécessitent un moteur de vectorisation pris en charge pour véritablement tirer parti de son amélioration des performances dans les scénarios OLAP. Par conséquent, l'idée de base de la transformation de l'exécuteur de colonnes est de traiter une colonne de données à la fois.

Comme l'exécuteur de lignes, le planificateur du moteur d'exécution vectoriel suit le mode Pipeline, mais chaque traitement et transfert de données entre opérateurs s'effectue un lot à la fois (soit 1 000 lignes de données), ce qui améliore le taux de réussite du processeur et réduit les opérations de lecture d'E/S. . La structure du flux de données de l'exécuteur de colonnes VectorBatch est illustrée dans la figure ci-dessous.

Structure du flux de données de l'exécuteur de colonnes VectorBatch

Mélange de lignes et de colonnes : opérateur d'adaptateur

Certains scénarios de tables de stockage de colonnes ne prennent pas en charge les moteurs d'exécution vectorisés, tels que : string_to_array, listagg, string_agg, etc.
GaussDB a la capacité de basculer automatiquement entre deux ensembles de moteurs de lignes et de colonnes.

Commutation automatique des moteurs de lignes et de colonnes

Pour les données de stockage de colonnes, s'il n'y a qu'un moteur de lignes, il est généralement nécessaire de reconstruire les données de colonnes en tuples pour que le moteur d'exécution puisse les traiter ligne par ligne. Le processus de déformation du tuple affecte les performances du traitement des requêtes de données de stockage de colonnes.

Performances du moteur d’exécution vectorisé

En comparant les performances de calcul de la même expression x*(1-y) par le moteur de stockage de lignes et de colonnes, nous pouvons voir que l'opérateur Cstore Scan du moteur de stockage de colonnes prend 85 % moins de temps que l'opérateur Seq Scan du stockage de lignes. moteur.

Comparaison des performances du moteur ligne/colonne

Les caractéristiques de l'informatique vectorielle sont les suivantes : calculer plusieurs valeurs à la fois, réduire les appels de fonction et les changements de contexte, et utiliser pleinement le cache du processeur et les instructions d'exécution vectorisées pour améliorer les performances.

Avantages en termes de performances des moteurs d'exécution vectorisés :

  • Un lot à la fois, lisez plus de données et réduisez le nombre de lectures d'E/S
  • En raison du grand nombre d'enregistrements dans le lot, le taux de réussite du cache du processeur correspondant augmente.
  • Le nombre d'appels de fonction lors de l'exécution du mode Pipeline est réduit.
  • Associé aux tables de stockage de colonnes pour réduire la déformation des tuples, c'est-à-dire le temps nécessaire à la reconstruction des tuples à partir des données de stockage de colonnes

Comparaison des opérateurs des exécuteurs ligne/colonne

Les opérateurs d'exécution du moteur de vectorisation sont similaires au moteur d'exécution de lignes, notamment les opérateurs de contrôle, les opérateurs d'analyse, les opérateurs de matérialisation et les opérateurs de connexion. Il sera également représenté par des nœuds, hérités des nœuds d'exécution de lignes, et le processus d'exécution sera récursif. Les principaux nœuds inclus sont : CStoreScan (analyse séquentielle), CStoreIndexScan (analyse d'index), CStoreIndexHeapScan (utilisation de Bitmap pour obtenir des tuples), VecMaterial (matérialisation), VecSort (tri), VecHashJoin (connexion de hachage vectorisée), etc., qui seront discutés un par un ci-dessous. Présentez ces opérateurs d’exécution.

Opérateur de numérisation

L'opérateur d'analyse est utilisé pour analyser les données de la table, et chaque fois qu'il obtient un tuple comme entrée du nœud supérieur, il existe dans le nœud feuille de l'arborescence du plan de requête. Il peut non seulement analyser la table, mais également. analysez le jeu de résultats de la fonction, la structure de la liste chaînée et le jeu de résultats de la requête. Certains des opérateurs d'analyse les plus courants sont présentés dans le tableau.

Opérateur (opérateur de stockage ligne/colonne) signification Scène d'apparition
SeqScan/CStoreScan analyse séquentielle L'opérateur d'analyse le plus basique, utilisé pour analyser les tables physiques (analyse séquentielle sans assistance d'index)
IndexScan/CStoreIndexScan analyse d'index Un index est créé sur les attributs entrant dans les critères de sélection
IndexOnlyScan/CStoreIndexOnlyScan Renvoie le tuple directement depuis l'index Les colonnes d'index couvrent entièrement les colonnes de l'ensemble de résultats
BitmapScan (BitmapIndexScan, BitmapHeapScan) / CStoreIndexHeapScan (CStoreIndexAnd, CStoreIndexOr,CStoreIndexCtidScan) Utilisez Bitmap pour obtenir des tuples BitmapIndexScan utilise l'index sur l'attribut pour analyser et renvoie le résultat sous forme de bitmap ; BitmapHeapScan obtient le tuple à partir de la sortie bitmap de BitmapIndexScan ;
TidScan Récupérer tuple par tuple tid 1.WHERE conditions (comme CTID = tid ou CTID IN (tid1, tid2, …)) ;2.UPDATE/DELETE… OÙ ACTUEL DU curseur
Sous-requêteScan/VecSubqueryScan analyse de sous-requête Utiliser une autre arborescence de plan de requête (sous-plan) comme objet d'analyse pour analyser les tuples
FonctionScan analyse des fonctions FROM nom_fonction
ValeursScan Scannez la liste chaînée des valeurs Scanner la collection de tuples donnée par la clause VALUES
ForeignScan/VecForeignScan Analyse de table externe Interroger une table externe
CteScan/VecCteScan Analyse du tableau CTE Analyser les sous-requêtes définies avec la clause WITH dans une requête SELECT

opérateur de connexion

L'opérateur de jointure correspond à l'opération de jointure en algèbre relationnelle. En prenant comme exemple la table t1 join t2, les principaux types de jointure centralisée sont les suivants : jointure interne, jointure gauche, jointure droite, jointure complète, semi-jointure, anti-jointure et leurs les méthodes d'implémentation incluent Nestloop ,HashJoin,MergeJoin ;

Opérateur (opérateur de stockage ligne/colonne) signification Scène d'apparition
NestLoop/VecNestLoop Connexion en boucle imbriquée, connexion violente, scannez la table interne pour chaque ligne Jointure interne, jointure externe gauche, semi-jointure, anti-jointure
FusionnerJoin/VecMergeJoin Fusionner la connexion (ordre de saisie), trier les tables internes et externes, positionner la première et la dernière extrémité et connecter les tuples en même temps. Equijointure Jointure interne, jointure externe gauche, jointure externe droite, jointure externe complète, semi-jointure, anti-jointure
HashJoin/VecHashjoin Jointure de hachage, les tables interne et externe utilisent la valeur de hachage de la colonne de jointure pour créer une table de hachage, et les mêmes valeurs doivent être dans le même compartiment de hachage. Equijointure Jointure interne, jointure externe gauche, jointure externe droite, jointure externe complète, semi-jointure, anti-jointure

opérateur de matérialisation

Les opérateurs matérialisés sont un type de nœud capable de mettre en cache des tuples. Pendant l'exécution, de nombreux opérateurs physiques étendus doivent d'abord obtenir tous les tuples avant de pouvoir fonctionner (comme les opérations de fonction d'agrégation, le tri sans assistance d'index, etc.). Cela nécessite l'utilisation d'opérateurs de matérialisation pour mettre en cache les tuples ;

Opérateur (opérateur de stockage ligne/colonne) signification Scène d'apparition
Matériel/VecMatériau se concrétiser Mettre en cache les résultats du nœud enfant
Trier/VecSort trier Clause ORDER BY, opération de connexion, opération de regroupement, opération d'ensemble, avec Unique
Groupe/VecGroup Opérations de regroupement Clause enfant GROUP BY
Agg/VecAgrégation Exécuter la fonction d'agrégation 1. Fonctions d'agrégation telles que COUNT/SUM/AVG/MAX/MIN ; 2. Clause DISTINCT 3. UNION pour supprimer les doublons ;
WindowAgg/VecWindowAgg fonction de fenêtre Clause FENÊTRE
Unique/VecUnique Déduplication (le niveau inférieur a été trié) 1. Clause DISTINCT ; 2. Déduplication UNION ;
Hacher Nœud d'assistance HashJoin Construisez une table de hachage et coopérez avec HashJoin
SetOp/VecSetOp Gestion des opérations de collecte INTERSECTER/INTERSECTER TOUT, SAUF/SAUF TOUT
Verrouiller les lignes Gestion des verrous au niveau des lignes SÉLECTIONNEZ… POUR PARTAGER/MISE À JOUR

opérateur de contrôle

Les opérateurs de contrôle sont un type de nœud utilisé pour gérer des situations spéciales et mettre en œuvre des processus d'exécution spéciaux.

Opérateur (opérateur de stockage ligne/colonne) signification Scène d'apparition
Résultat/VecRésultat Calculer directement 1. N'inclut pas l'analyse de table ; 2. Il n'y a qu'une seule clause VALUES dans l'instruction INSERT 3. Lorsque Append/MergeAppend est le nœud racine du plan (projection push-up) ;
ModifierTable INSERT/UPDATE/DELETE nœud supérieur INSÉRER/METTRE À JOUR/SUPPRIMER
Ajouter/VecAppend ajout 1. UNION(TOUS); 2. Table d'héritage
FusionnerAjouter Ajouter (saisie ordonnée) 1. UNION(TOUS); 2. Table d'héritage
Union récursive Gestion des sous-requêtes UNION définies de manière récursive dans la clause WITH AVEC RECURSIVE… SELECT… instruction
BitmapEt Opération ET logique bitmap BitmapScan pour l'analyse d'index multidimensionnel
BitmapOu Opération OU logique bitmap BitmapScan pour l'analyse d'index multidimensionnel
Limite/VecLimit Gestion des clauses LIMIT DÉCALAGE… LIMITE…

Autres opérateurs

D'autres opérateurs incluent les opérateurs Stream et les opérateurs tels que RemoteQuery

Opérateur (opérateur de stockage ligne/colonne) signification Scène d'apparition
Flux Échange de données multi-nœuds Exécutez un plan de requête distribué et il y a un échange de données entre les nœuds
Itérateur de partition Itérateur partitionné Analyse de la table de partition, analyse itérative de chaque partition
VectToRow/RowToVec Colonne à ligne/Ligne à colonne Scène mixte de grades et grades
DfsScan/DfsIndexScan Analyse de table (index) HDFS Analyse de table HDFS

L'évolution de la vectorisation Gaussdb

Après le moteur de vectorisation de première génération, GaussDB a évolué avec des moteurs de vectorisation plus performants : moteur de vectorisation Sonic et moteur de vectorisation Turbo.
Afin d'améliorer les performances d'exécution OLAP, GaussDB continue d'évoluer sur la voie du stockage en colonnes + moteur d'exécution vectorisé et calcul par lots :

  • Opérateur de flux + cadre d'exécution distribué prenant en charge le flux de données entre plusieurs nœuds
  • SMP, parallélisme multithread au sein du nœud, exploitant pleinement les ressources matérielles inutilisées
  • La technologie LLVM, un nouveau framework de génération de code, un compilateur JIT (juste à temps), élimine les goulots d'étranglement liés à la déformation des tuples.
  • Le moteur de vectorisation Sonic vectorise davantage les opérateurs HashAgg et HashJoin et implémente différents tableaux pour calculer les données en fonction des différents types de chaque colonne.
  • Le moteur de vectorisation Turbo de nouvelle génération vectorise davantage la plupart des opérateurs. Basé sur le moteur Sonic, l'optimisation Null, l'optimisation des grands entiers, l'optimisation du flux, l'optimisation du tri, etc. sont ajoutées pour améliorer encore les performances.

Résumer

Cet article présente le moteur d'exécution vectoriel GaussDB et développe son cadre, ses principes, sa présentation de chaque opérateur et l'amélioration des performances.

 

Cliquez pour suivre et découvrir les nouvelles technologies de Huawei Cloud dès que possible~

 

J'ai décidé d'abandonner l'open source Hongmeng Wang Chenglu, le père de l'open source Hongmeng : L'open source Hongmeng est le seul événement logiciel industriel d'innovation architecturale dans le domaine des logiciels de base en Chine - OGG 1.0 est publié, Huawei contribue à tout le code source. Google Reader est tué par la "montagne de merde de code" Fedora Linux 40 est officiellement publié Ancien développeur Microsoft : les performances de Windows 11 sont "ridiculement mauvaises" Ma Huateng et Zhou Hongyi se serrent la main pour "éliminer les rancunes" Des sociétés de jeux bien connues ont publié de nouvelles réglementations : les cadeaux de mariage des employés ne doivent pas dépasser 100 000 yuans Ubuntu 24.04 LTS officiellement publié Pinduoduo a été condamné pour concurrence déloyale Indemnisation de 5 millions de yuans
{{o.name}}
{{m.nom}}

Je suppose que tu aimes

Origine my.oschina.net/u/4526289/blog/11054711
conseillé
Classement