Este artículo se comparte desde la comunidad de la nube de Huawei " Explicación detallada del motor de ejecución vectorizada GaussDB (DWS) , autor: yd_212508532.
Prefacio
- Versión aplicable: [Función de referencia]
La mayoría de los motores de ejecución de filas tradicionales adoptan un modo de ejecución de una tupla a la vez. De esta manera, la mayor parte del tiempo durante el proceso de ejecución, la CPU no se utiliza para procesar datos, sino más bien para atravesar el árbol de ejecución. conducirá a una baja utilización efectiva de la CPU. Frente a una gran cantidad de llamadas a funciones en escenarios OLAP, se requiere una gran sobrecarga. Para solucionar este problema, se agregó un motor de vectorización a GaussDB (DWS). El motor de vectorización utiliza un modo de ejecución de tuplas por lotes a la vez, lo que puede reducir en gran medida el costo de atravesar los nodos de ejecución. Al mismo tiempo, el motor de vectorización también está conectado naturalmente al almacenamiento de columnas, lo que facilita la carga de datos de columnas vectorizadas en los nodos de escaneo subyacentes. ¡Almacenamiento de columnas + motor de ejecución vectorizada es una de las llaves de oro que abre la puerta al rendimiento OLAP!
Acerca del almacenamiento de filas y de las tablas de almacenamiento de columnas
La tabla de almacenamiento de filas almacena tuplas en páginas de página por filas. Se utiliza principalmente en escenarios de TP donde los datos se actualizan con frecuencia, hay muchas adiciones, eliminaciones y modificaciones, y los resultados de la consulta involucran varias columnas de la tabla.
Las tablas de almacenamiento de columnas se almacenan en columnas y los datos de cada columna se almacenan en un archivo. Se utiliza principalmente en escenarios AP.
- La cantidad de columnas de la tabla es grande, la cantidad de columnas a las que se accede es pequeña y la cantidad de operaciones de IO se reduce.
- Los datos de la columna son homogéneos, lo que mejora la relación de compresión de datos.
- Operaciones basadas en datos por lotes de columnas, la tasa de aciertos de la caché de la CPU es alta
marco de ejecución
El ejecutor es el centro de interacción entre el optimizador y el motor de almacenamiento. Tomando como entrada el árbol del plan de ejecución generado por el optimizador, se accede a los datos desde el motor de almacenamiento y se operan varios operadores de ejecución de acuerdo con el plan para realizar el procesamiento de datos. Usando el modo Pipeline, el ejecutor de fila opera una tupla a la vez y el ejecutor de columna opera un lote a la vez. La capa superior controla la capa inferior, lo que permite que los datos fluyan hacia arriba en el árbol de ejecución. Proporciona operadores de ejecución para diversos procesamientos de datos. La siguiente figura muestra el flujo de control de arriba hacia abajo y el flujo de datos de abajo hacia arriba.
El proceso de ejecución del ejecutor se puede dividir en estos tres pasos:
- Inicialización del ejecutor: construya el estado de información de estado global del ejecutor, recorra recursivamente cada nodo del árbol del plan e inicialice su estado del plan de información de estado de ejecución
- Ejecución del ejecutor: las entradas del motor de filas y del motor de vectorización son independientes. Comenzando desde el nodo raíz del árbol del plan, atraviesa recursivamente hasta los nodos de hoja para obtener una tupla / lote Después del procesamiento capa por capa. operadores de nodo, se devuelve un resultado tupla/lote hasta que No más tupla/lote.
- Limpiar el ejecutor: recicle la información de estado global del ejecutor y limpie el estado de ejecución de cada nodo del plan.
ejecutor de columna
El problema con el ejecutor de filas es que la mayor parte del procesamiento de la CPU está en el proceso de atravesar el árbol del plan en lugar de procesar realmente los datos, y la utilización efectiva de la CPU es baja. Los escenarios de aplicación únicos de tablas de almacenamiento de columnas requieren un motor de vectorización compatible para aprovechar realmente su mejora de rendimiento en escenarios OLAP. Por lo tanto, la idea básica de transformar el ejecutor de columnas es procesar una columna de datos a la vez.
Al igual que el ejecutor de filas, el programador del motor de ejecución vectorizado sigue el modo Pipeline, pero cada procesamiento y transferencia de datos entre operadores es un lote a la vez (es decir, 1000 filas de datos), lo que mejora la tasa de aciertos de la CPU y reduce las operaciones de lectura de E/S. . La estructura de flujo de datos del ejecutor de columnas VectorBatch se muestra en la siguiente figura.
Mezclar filas y columnas: operador adaptador
Algunos escenarios de tablas de almacenamiento de columnas no admiten motores de ejecución vectorizados, como: string_to_array, listagg, string_agg, etc.
GaussDB tiene la capacidad de cambiar automáticamente entre dos conjuntos de motores de filas y columnas.
Para los datos de almacenamiento de columnas, si solo hay un motor de filas, generalmente es necesario reconstruir los datos de las columnas en tuplas para que el motor de ejecución procese fila por fila. El proceso de deformación de tuplas afecta el rendimiento del procesamiento de consultas de datos de almacenamiento de columnas.
Rendimiento del motor de ejecución vectorizado
Comparando el rendimiento de cálculo de la misma expresión x*(1-y) por el motor de almacenamiento de filas y columnas, podemos ver que el operador Cstore Scan del motor de almacenamiento de columnas tarda un 85% menos que el operador Seq Scan del almacenamiento de filas. motor.
Las características de la computación vectorial son: calcular múltiples valores a la vez, reducir las llamadas a funciones y los cambios de contexto, y aprovechar al máximo el caché de la CPU y las instrucciones de ejecución vectorizadas para mejorar el rendimiento.
Ventajas de rendimiento de los motores de ejecución vectorizados:
- Un lote a la vez, lea más datos y reduzca la cantidad de lecturas de IO
- Debido a la gran cantidad de registros en el lote, aumenta la tasa de aciertos de caché de la CPU correspondiente.
- Se reduce el número de llamadas a funciones durante la ejecución del modo Pipeline.
- Combinado con tablas de almacenamiento de columnas para reducir la deformación de tuplas, es decir, la sobrecarga de tiempo necesaria para reconstruir tuplas a partir de datos de almacenamiento de columnas.
Comparación de operadores de ejecutores de fila/columna
Los operadores de ejecución del motor de vectorización son similares al motor de ejecución de filas, incluidos operadores de control, operadores de escaneo, operadores de materialización y operadores de conexión. También estará representado por nodos, heredados de los nodos de ejecución de filas, y el proceso de ejecución será recursivo. Los principales nodos incluidos son: CStoreScan (escaneo secuencial), CStoreIndexScan (escaneo de índice), CStoreIndexHeapScan (utilizando Bitmap para obtener tuplas), VecMaterial (materialización), VecSort (ordenación), VecHashJoin (conexión hash vectorizada), etc., que serán Se analizan uno por uno a continuación. Presente estos operadores de ejecución.
Operador de escaneo
El operador de escaneo se utiliza para escanear los datos en la tabla, y cada vez que obtiene una tupla como entrada del nodo superior, existe en el nodo hoja del árbol del plan de consulta. No solo puede escanear la tabla, sino también. escanea el conjunto de resultados de la función, la estructura de la lista vinculada y el conjunto de resultados de la consulta. Algunos de los operadores de escaneo más comunes se muestran en la tabla.
Operador (operador de almacenamiento de fila/columna) | significado | aparecer escena |
---|---|---|
SeqScan/CStoreScan | escaneo secuencial | El operador de escaneo más básico, utilizado para escanear tablas físicas (escaneo secuencial sin asistencia de índice) |
IndexScan/CStoreIndexScan | escaneo de índice | Se crea un índice sobre los atributos involucrados en los criterios de selección. |
IndexOnlyScan/CStoreIndexOnlyScan | Devuelve tupla directamente desde el índice | Las columnas de índice cubren completamente las columnas del conjunto de resultados |
BitmapScan(BitmapIndexScan, BitmapHeapScan) / CStoreIndexHeapScan (CStoreIndexAnd, CStoreIndexOr,CStoreIndexCtidScan) | Utilice Bitmap para obtener tuplas | BitmapIndexScan utiliza el índice del atributo para escanear y devuelve el resultado como un mapa de bits. BitmapHeapScan obtiene la tupla de la salida del mapa de bits de BitmapIndexScan; |
TidScan | Obtener tupla por tupla tid | 1.DONDE condiciones (como CTID = tid o CTID IN (tid1, tid2,…)) ;2.ACTUALIZAR/BORRAR… DONDE ACTUAL DEL cursor |
SubconsultaScan/VecSubqueryScan | escaneo de subconsultas | Utilice otro árbol de plan de consulta (subplan) como objeto de escaneo para escanear tuplas |
FunciónEscanear | escaneo de funciones | DESDE nombre_función |
ValoresEscanear | Escanee la lista vinculada de valores | Escanee la colección de tuplas dada por la cláusula VALUES |
ForeignScan/VecForeignScan | Escaneo de tabla externa | Consultar tabla externa |
CteScan/VecCteScan | Escaneo de tabla CTE | Escanear subconsultas definidas con la cláusula FROM en una consulta SELECT |
operador de conexión
El operador de unión corresponde a la operación de unión en álgebra relacional. Tomando la tabla t1 y t2 como ejemplo, los principales tipos de unión centralizada son los siguientes: unión interna, unión izquierda, unión derecha, unión completa, semiunión, antiunión y sus. los métodos de implementación incluyen Nestloop, HashJoin, MergeJoin ;
Operador (operador de almacenamiento de fila/columna) | significado | aparecer escena |
---|---|---|
NestLoop/VecNestLoop | Conexión de bucle anidado, conexión violenta, escanee la tabla interna para cada fila | Unión interior, Unión exterior izquierda, Semi unión, Anti unión |
Fusionar unión/VecMergeJoin | Fusionar conexiones (orden de entrada), ordenar tablas internas y externas, posicionar el primer y último extremo y conectar tuplas a la vez. Equijuntar | Unión interior, Unión exterior izquierda, Unión exterior derecha, Unión exterior completa, Semi unión, Anti unión |
HashJoin/VecHashjoin | Unión hash, las tablas interna y externa usan el valor hash de la columna de unión para crear una tabla hash, y los mismos valores deben estar en el mismo depósito hash. Equijuntar | Unión interior, Unión exterior izquierda, Unión exterior derecha, Unión exterior completa, Semi unión, Anti unión |
operador de materialización
Los operadores materializados son un tipo de nodo que puede almacenar en caché tuplas. Durante la ejecución, muchos operadores físicos extendidos primero deben obtener todas las tuplas antes de poder operar (como operaciones de funciones agregadas, clasificación sin asistencia de índice, etc.). Esto requiere el uso de operadores de materialización para almacenar en caché las tuplas;
Operador (operador de almacenamiento de fila/columna) | significado | aparecer escena |
---|---|---|
Material/VecMaterial | materializar | Almacenar en caché los resultados del nodo secundario |
Ordenar/VecSort | clasificar | Cláusula ORDER BY, operación de conexión, operación de agrupación, operación de conjunto, con Unique |
Grupo/VecGrupo | Operaciones de agrupación | GROUP BY cláusula secundaria |
Agregación Agg/Vec | Ejecutar función agregada | 1. Funciones de agregación como COUNT/SUM/AVG/MAX/MIN; 2. Cláusula DISTINCT 3. UNION para eliminar duplicados 4. Cláusula GROUP BY; |
VentanaAgg/VecVentanaAgg | función de ventana | cláusula de ventana |
Único/VecÚnico | Deduplicación (el nivel inferior ha sido ordenado) | 1. Cláusula DISTINTA; 2. Deduplicación UNIÓN |
Picadillo | Nodo auxiliar HashJoin | Construya una tabla hash y coopere con HashJoin |
SetOp/VecSetOp | Manejo de operaciones de cobranza. | INTERSECTAR/INTERSECTAR TODOS, EXCEPTO/EXCEPTO TODOS |
Bloquear filas | Manejo de bloqueos a nivel de fila | SELECCIONE... PARA COMPARTIR/ACTUALIZAR |
operador de control
Los operadores de control son un tipo de nodo que se utiliza para manejar situaciones especiales e implementar procesos de ejecución especiales.
Operador (operador de almacenamiento de fila/columna) | significado | aparecer escena |
---|---|---|
Resultado/VecResultado | Calcular directamente | 1. No incluye escaneo de tabla; 2. Solo hay una cláusula VALUES en la instrucción INSERT 3. Cuando Append/MergeAppend es el nodo raíz del plan (empuje hacia arriba de proyección); |
Modificar tabla | INSERTAR/ACTUALIZAR/ELIMINAR nodo superior | INSERTAR/ACTUALIZAR/ELIMINAR |
Agregar/VecAppend | suma | 1. UNIÓN (TODOS); 2. Tabla de herencia |
FusionarAgregar | Agregar (entrada ordenada) | 1. UNIÓN (TODOS); 2. Tabla de herencia |
Unión recursiva | Manejo de subconsultas UNION definidas recursivamente en la cláusula CON | CON RECURSIVE... SELECT... declaración |
Mapa de bitsY | Operación Y lógica de mapa de bits | BitmapScan para escaneo de índice multidimensional |
Mapa de bits o | Operación lógica OR de mapa de bits | BitmapScan para escaneo de índice multidimensional |
Límite/VecLimit | Manejo de cláusulas LIMIT | COMPENSACIÓN... LÍMITE... |
Otros operadores
Otros operadores incluyen operadores Stream y operadores como RemoteQuery.
Operador (operador de almacenamiento de fila/columna) | significado | aparecer escena |
---|---|---|
Arroyo | Intercambio de datos de múltiples nodos | Ejecute un plan de consulta distribuido y hay intercambio de datos entre nodos. |
Iterador de partición | Iterador particionado | Escaneo de la tabla de particiones, escanea iterativamente cada partición |
VecToRow/RowToVec | Columna a fila/Fila a columna | Escena mixta de filas y filas. |
DfsScan/DfsIndexScan | Escaneo de tabla HDFS (índice) | Escaneo de tabla HDFS |
La evolución de la vectorización Gaussdb.
Después del motor de vectorización de primera generación, GaussDB evolucionó motores de vectorización con mayor rendimiento: motor de vectorización Sonic y motor de vectorización Turbo.
Para mejorar el rendimiento de ejecución de OLAP, GaussDB continúa evolucionando en el camino del almacenamiento de columnas + motor de ejecución vectorizada y cálculo por lotes:
- Operador de flujo + marco de ejecución distribuida que admite el flujo de datos entre múltiples nodos
- SMP, paralelismo multiproceso dentro del nodo, aprovechando al máximo los recursos de hardware inactivos
- La tecnología LLVM, un nuevo marco de generación de código, compilador JIT (justo a tiempo), elimina los cuellos de botella de deformación de tuplas
- El motor de vectorización sónica vectoriza aún más los operadores HashAgg y HashJoin e implementa diferentes matrices para calcular datos según los diferentes tipos de cada columna.
- El motor de vectorización Turbo de nueva generación vectoriza aún más a la mayoría de los operadores. Basado en el motor Sonic, se agregan optimización nula, optimización de enteros grandes, optimización de flujo, optimización de clasificación, etc., para mejorar aún más el rendimiento.
Resumir
Este artículo presenta el motor de ejecución vectorizada GaussDB y detalla su marco, principios, descripción general de cada operador y mejora del rendimiento.
Haga clic para seguir y conocer las nuevas tecnologías de Huawei Cloud lo antes posible ~
Decidí renunciar al código abierto Hongmeng Wang Chenglu, el padre del código abierto Hongmeng: El código abierto Hongmeng es el único evento de software industrial de innovación arquitectónica en el campo del software básico en China: se lanza OGG 1.0, Huawei contribuye con todo el código fuente. Google Reader es asesinado por la "montaña de mierda de códigos" Fedora Linux 40 se lanza oficialmente Ex desarrollador de Microsoft: el rendimiento de Windows 11 es "ridículamente malo" Ma Huateng y Zhou Hongyi se dan la mano para "eliminar rencores" Compañías de juegos reconocidas han emitido nuevas regulaciones : los regalos de boda de los empleados no deben exceder los 100.000 yuanes Ubuntu 24.04 LTS lanzado oficialmente Pinduoduo fue sentenciado por competencia desleal Compensación de 5 millones de yuanes