Uso del motor Turbo para mejorar el rendimiento de las consultas de datos
Escenario
El motor Turbo vectorizado es un motor de procesamiento de datos de alto rendimiento que utiliza la vectorización para mejorar en gran medida la eficiencia y la velocidad. Supera de manera innovadora los principales cuellos de botella de rendimiento de los motores de ejecución de almacenamiento de columnas tradicionales. Las ganancias de rendimiento se logran optimizando los formatos de datos, desarrollando algoritmos hash avanzados, personalizando algoritmos de procesamiento de datos basados en características de datos de tiempo de ejecución y reconstruyendo operadores y algoritmos.
En comparación con el motor de ejecución de almacenamiento de columnas original, el motor Turbo optimiza los formatos de almacenamiento en memoria y en disco para cadenas y tipos numéricos, y mejora el rendimiento de operadores comunes como sort, aggregate (agg), join y scan. Esto duplica el rendimiento general del executor y reduce significativamente los costos de computación.
En escenarios de almacenamiento en caché de datos en memoria, las pruebas de referencia muestran resultados impresionantes:
- Rendimiento de TPC-H: Mejorado entre un 50 % y 1.5 veces.
- Rendimiento de TPC-DS: Mejorado entre un 50 % y un 80 %.
- Rendimiento de SSB: Aumentado en un 70 %.
- Rendimiento de ordenación completa: Mejorado en un 90 %.
Notas y restricciones
- Solo los clústeres de 9.1.0.210 y versiones posteriores admiten esta función.
- Si la consulta de trabajo no involucra los operadores merge join o sort agg, el ejecutor puede utilizar el motor de ejecución Turbo. Confírmalo durante la planificación del servicio.
- Para utilizar el motor Turbo, la tabla base debe ser una tabla Turbo. Esto significa que el parámetro de tabla enable_turbo_store se establece en on y el parámetro GUC turbo_engine_version se establece en 3. Para deshabilitar el motor Turbo, establece turbo_engine_version en 0.
- Las tablas de almacenamiento de columnas ordinarias de la versión 3.0 no admiten el formato de almacenamiento Turbo. Para utilizar el almacenamiento Turbo, configura la tabla como una tabla HStore Opt. Al crear una tabla de almacenamiento de columnas 3.0, activa enable_hstore_opt para habilitar el almacenamiento Turbo.
- Para una tabla Turbo, si p en numeric(p,s) es menor o igual que 38, no se puede insertar NaN. Para admitir NaN, cambia el valor de p a un valor mayor que 38 o habilita el parámetro turbo_support_nan.
Uso de una tabla Turbo
- Utiliza el cliente para conectarte al clúster de DWS.
- Ejecuta los siguientes comandos y asegúrate de que el parámetro GUC turbo_engine_version esté establecido en 3:
1 2
SHOW turbo_engine_version; SET turbo_engine_version = 3;
- Ejecuta la siguiente sentencia SQL para crear una tabla temporal llamada src. La tabla contiene solo una fila de datos y proporciona fuentes de datos para las operaciones INSERT posteriores.
1CREATE TABLE src AS SELECT 1;
- Ejecuta las siguientes sentencias SQL para crear dos tablas. Una se llama non_turbo_table con Turbo deshabilitado y la otra se llama turbo_table con Turbo habilitado.
1 2
CREATE TABLE non_turbo_table(a int, b numeric(15,2)) WITH(orientation=column,enable_turbo_store=off); CREATE TABLE turbo_table(a int, b numeric(15,2)) WITH(orientation=column,enable_turbo_store=on);
- Ejecuta las sentencias SQL siguientes para insertar 20 millones de filas de datos en las dos tablas. La ejecución tarda aproximadamente medio minuto.
1 2
INSERT INTO non_turbo_table SELECT generate_series(1,20000000) % 1000,generate_series(1,20000000) FROM src; INSERT INTO turbo_table SELECT generate_series(1,20000000) % 1000,generate_series(1,20000000) FROM src;
- Ejecuta las siguientes sentencias SQL para obtener el rendimiento de consulta de las dos tablas:
1 2
EXPLAIN PERFORMANCE SELECT sum(b) FROM non_turbo_table GROUP BY a; EXPLAIN PERFORMANCE SELECT sum(b) FROM turbo_table GROUP BY a;
El resultado del comando para la tabla con Turbo deshabilitado es el siguiente (solo se muestran la descripción general del plan de consulta y el resumen de la consulta). La duración total de la consulta es de 196.335 ms.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
QUERY PLAN id | operation | A-time | A-rows | E-rows | E-distinct | Peak Memory | E-memory | A-width | E-width | E-costs ----+----------------------------------------------------------+--------------------+----------+----------+------------+----------------+----------+---------+---------+---------- 1 | -> Row Adapter | 193.352 | 1000 | 1000 | | 23KB | | | 42 | 26197.71 2 | -> Vector Streaming (type: GATHER) | 193.283 | 1000 | 1000 | | 167KB | | | 42 | 26197.71 3 | -> Vector Sonic Hash Aggregate | [181.540, 182.619] | 1000 | 1000 | | [1MB, 1MB] | 16MB | [21,21] | 42 | 26161.18 4 | -> Vector Streaming(type: REDISTRIBUTE) | [180.863, 182.166] | 3000 | 6000 | | [183KB, 215KB] | 2MB | | 42 | 26154.51 5 | -> Vector Sonic Hash Aggregate | [88.320, 117.714] | 3000 | 6000 | | [1MB, 1MB] | 16MB | [21,21] | 42 | 26114.00 6 | -> CStore Scan on public.non_turbo_table | [32.022, 41.146] | 20000000 | 20000000 | | [869KB, 869KB] | 1MB | | 10 | 9437.33 ... ====== Query Summary ===== ------------------------------------------------------------------------------- Datanode executor start time [dn_6003_6004, dn_6009_6010]: [1.949 ms,2.231 ms] Datanode executor run time [dn_6005_6006, dn_6007_6008]: [181.600 ms,182.674 ms] Datanode executor end time [dn_6003_6004, dn_6009_6010]: [0.041 ms,0.056 ms] Remote query poll time: 186.041 ms, Deserialze time: 0.036 ms System available mem: 2129920KB Query Max mem: 2129920KB Query estimated mem: 4063KB Enqueue time: 0.015 ms Coordinator executor start time: 0.551 ms Coordinator executor run time: 193.649 ms Coordinator executor end time: 0.071 ms Total network : 59kB Parser runtime: 0.000 ms Planner runtime: 1.945 ms Query Id: 145241088537559390 Unique SQL Id: 1249234219 Unique SQL Hash: sql_41862c1cdf0f08d7e33d51f39bfda62d Total runtime: 196.335 ms
El resultado del comando para la tabla con Turbo habilitado es el siguiente (solo se muestran la descripción general del plan de consulta y el resumen de la consulta). La duración total de la consulta es de 51.101 ms.
Después de habilitar el motor Turbo, el tiempo de consulta se reduce considerablemente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
QUERY PLAN id | operation | A-time | A-rows | E-rows | E-distinct | Peak Memory | E-memory | A-width | E-width | E-costs ----+------------------------------------------------------+------------------+----------+----------+------------+----------------+----------+---------+---------+---------- 1 | -> Row Adapter | 49.316 | 1000 | 1000 | | 23KB | | | 42 | 27429.71 2 | -> Vector Streaming (type: GATHER) | 49.253 | 1000 | 1000 | | 167KB | | | 42 | 27429.71 3 | -> Vector Sonic Hash Aggregate | [37.402, 38.366] | 1000 | 1000 | | [942KB, 942KB] | 16MB | [30,30] | 42 | 27393.18 4 | -> Vector Streaming(type: REDISTRIBUTE) | [37.111, 38.200] | 3000 | 6000 | | [183KB, 183KB] | 2MB | | 42 | 27386.51 5 | -> Vector Sonic Hash Aggregate | [29.227, 31.946] | 3000 | 6000 | | [942KB, 942KB] | 16MB | [30,30] | 42 | 27346.00 6 | -> CStore Scan on public.turbo_table | [10.392, 11.590] | 20000000 | 20000000 | | [917KB, 917KB] | 1MB | | 10 | 10669.33 ... ====== Query Summary ===== ------------------------------------------------------------------------------ Datanode executor start time [dn_6005_6006, dn_6001_6002]: [1.056 ms,1.803 ms] Datanode executor run time [dn_6001_6002, dn_6009_6010]: [37.429 ms,38.416 ms] Datanode executor end time [dn_6009_6010, dn_6005_6006]: [0.037 ms,0.110 ms] Remote query poll time: 41.001 ms, Deserialze time: 0.013 ms System available mem: 2129920KB Query Max mem: 2129920KB Query estimated mem: 4063KB Turbo Engine: true Enqueue time: 0.016 ms Coordinator executor start time: 0.451 ms Coordinator executor run time: 49.599 ms Coordinator executor end time: 0.105 ms Total network : 33kB Parser runtime: 0.000 ms Planner runtime: 0.859 ms Query Id: 145241088537562603 Unique SQL Id: 1906062289 Unique SQL Hash: sql_be1160458499bd4c66933be3ecd942cc Total runtime: 51.101 ms