Todos los productos
Search
Centro de documentos

PolarDB:Use the Elastic Parallel Query feature to run analytical queries

Última actualización: Sep 17, 2026

Elastic Parallel Query distribuye las consultas analíticas en varios nodos de solo lectura de forma paralela. Esto permite habilitar capacidades de procesamiento transaccional y analítico híbrido (HTAP) en PolarDB for PostgreSQL (Compatible with Oracle). Este tema explica cómo funciona esta función, cómo configurarla y cómo controlar el paralelismo a nivel de sistema, sesión y consulta.

Funcionamiento

Elastic Parallel Query utiliza dos tipos de nodos:

  • Nodo coordinador de consultas (QC): recibe la solicitud de consulta, divide el plan de ejecución en shards, enruta los shards a los nodos de ejecución paralela (PX) y agrega los resultados.

  • Nodos PX: cada uno ejecuta un shard asignado, lee bloques de datos del sistema de almacenamiento compartido Polar File System (PolarFS) y devuelve los resultados al nodo QC.

How the cross-node parallel execution feature works

En la figura anterior, RO1 es el nodo QC, mientras que RO2, RO3 y RO4 son nodos PX. RO1 divide el plan de ejecución en tres shards y los enruta. Cada nodo PX lee desde PolarFS y envía los resultados de vuelta a RO1, que los combina para formar el resultado final.

Notas de uso

Elastic Parallel Query está deshabilitado de forma predeterminada y requiere varios nodos de solo lectura. Esta función es adecuada únicamente para consultas analíticas que se ejecutan con poca frecuencia.

Parámetros

Configure a continuación los parámetros para habilitar y ajustar Elastic Parallel Query.

Parámetro

Descripción

Valor predeterminado

polar_enable_px

Habilita o deshabilita Elastic Parallel Query. Establezca este valor en on para habilitarlo.

off

polar_px_dop_per_node

Grado de paralelismo (DoP) por sesión y por nodo. Cada nodo utiliza esta cantidad de procesos de trabajo PX para una consulta. Para obtener el throughput máximo, establezca este valor con la cantidad de núcleos de CPU de sus nodos.

1

polar_px_max_workers_number

Cantidad máxima de procesos de trabajo por nodo en todas las sesiones. Limita el paralelismo total sin importar la configuración de DoP.

30

polar_px_nodes

Lista separada por comas de los nodos de solo lectura que se usarán para la ejecución paralela. Deje este campo vacío para utilizar todos los nodos de solo lectura disponibles.

(todos los nodos)

polar_px_enable_replay_wait

Habilita la consistencia fuerte. Cuando se establece en on, los nodos de solo lectura reproducen todos los registros del registro WAL hasta el momento en que se inicia la consulta, antes de ejecutarla. Esto garantiza que los nodos lean los cambios DDL más recientes, pero reduce el rendimiento de la consulta.

off

px_workers

Parámetro a nivel de tabla que controla si Elastic Parallel Query se aplica a una tabla específica. Establezca este valor en 1 para habilitarlo, en -1 para deshabilitarlo y en 0 para usar el valor predeterminado (no se aplica).

0

polar_cluster_map

Parámetro de solo lectura que enumera los nombres de todos los nodos de solo lectura del clúster. Se actualiza automáticamente cuando se agregan nodos. Solo está disponible para clústeres que ejecutan la versión secundaria del kernel 1.1.20 (publicada en enero de 2022) o anteriores.

N/D

synchronous_commit

Controla si una transacción espera a que los registros WAL se escriban en el disco antes de devolver un mensaje de éxito. Valores válidos: off, on, local, remote_write, remote_apply. En el modo PX, este parámetro se establece en on.

on

Consideraciones clave:

  • polar_enable_px: debe establecerse en on antes de que cualquier otra configuración surta efecto. Configure este valor a nivel de sistema para habilitar la función de forma global, o a nivel de sesión para limitarla a cargas de trabajo específicas.

  • `polar_px_dop_per_node`: si establece un valor demasiado alto en nodos que ejecutan sesiones simultáneas, se multiplica el uso de procesos de trabajo. Cada sesión puede consumir hasta polar_px_dop_per_node procesos de trabajo por nodo, por lo que el uso total equivale al DoP multiplicado por la cantidad de sesiones activas. Compruebe que el total no supere polar_px_max_workers_number.

  • polar_px_enable_replay_wait: establézcalo en on únicamente cuando su carga de trabajo incluya cambios DDL recientes (como CREATE TABLE) que los nodos de solo lectura aún no hayan reproducido. Para cargas de trabajo analíticas con muchas lecturas y sin actividad DDL reciente, mantenga este valor en off para evitar la sobrecarga de reproducción.

  • px_workers: utilice este parámetro para limitar Elastic Parallel Query a tablas específicas de alto valor, en lugar de habilitarlo de forma global. Así se reduce el consumo innecesario de recursos en tablas que no se benefician del paralelismo.

Control del paralelismo a nivel de sistema, sesión y consulta

Elastic Parallel Query se puede habilitar y ajustar en tres niveles. El nivel que elija depende de su caso de uso:

  • System level: aplique Elastic Parallel Query de forma global para todas las consultas y sesiones. Utilice este nivel cuando su clúster esté dedicado a cargas de trabajo analíticas.

  • Session level: habilite, deshabilite o fuerce Elastic Parallel Query para la conexión actual. Más indicado para consultas analíticas ad hoc en un clúster con cargas de trabajo mixtas.

  • Query level: anule el paralelismo de una sola consulta mediante hints. Recomendado cuando necesita optimizar consultas específicas sin modificar los valores predeterminados de la sesión o del sistema.

Nivel de sistema

Configure los parámetros globales Grand Unified Configuration (GUC) para habilitar Elastic Parallel Query en todas las sesiones.

postgres=# alter system set polar_enable_px=1;
ALTER SYSTEM
postgres=# alter system set polar_px_dop_per_node=1;
ALTER SYSTEM
postgres=# select pg_reload_conf();
 pg_reload_conf
----------------
 t
(1 row)
postgres=# \c postgres
You are now connected to database "postgres" as user "postgres".

postgres=# drop table if exists t1;
DROP TABLE
postgres=# select id into t1 from generate_series(1, 1000) as id order by id desc;
SELECT 1000
postgres=# alter table t1 set (px_workers=1);
ALTER TABLE
postgres=# explain (verbose, costs off)   select * from t1 where id < 10;
                QUERY PLAN
-------------------------------------------
 PX Coordinator 2:1  (slice1; segments: 2)
   Output: id
   ->  Partial Seq Scan on public.t1
         Output: id
         Filter: (t1.id < 10)
 Optimizer: PolarDB PX Optimizer
(6 rows)

El nodo PX Coordinator en la salida del plan confirma que Elastic Parallel Query está activo. El valor segments: 2 refleja el DoP multiplicado por la cantidad de nodos PX en uso.

Nivel de sesión

Controle Elastic Parallel Query para la sesión actual mediante la instrucción ALTER SESSION o los parámetros GUC. Los cambios se aplican únicamente a la conexión actual.

Sintaxis de ALTER SESSION

ALTER SESSION ENABLE PARALLEL QUERY
ALTER SESSION DISABLE PARALLEL QUERY
ALTER SESSION FORCE PARALLEL QUERY [PARALLEL integer]
  • ENABLE PARALLEL QUERY: permite usar hints y sintaxis para habilitar Elastic Parallel Query en esta sesión.

  • DISABLE PARALLEL QUERY: bloquea Elastic Parallel Query en esta sesión, incluso si los hints lo especifican.

  • FORCE PARALLEL QUERY [PARALLEL integer]: fuerza Elastic Parallel Query sin importar otras configuraciones. Si omite PARALLEL integer, el DoP toma de forma predeterminada el valor de polar_px_dop_per_node.

Priority order cuando hay conflictos entre varias configuraciones: hint a nivel de consulta (el más alto) > FORCE PARALLEL > polar_px_dop_per_node (el más bajo).

Después de reconectar la sesión actual, Elastic Parallel Query se habilita de forma predeterminada para dicha sesión.

Ejemplo: habilitación para una sesión:

--enable
postgres=# set polar_enable_px = false;
SET
postgres=# set polar_px_enable_hint = true;
SET
postgres=# alter session enable parallel query;
ALTER SESSION

postgres=# explain (verbose, costs off)   select /*+ PARALLEL(4)*/ * from t1 where id < 10;
INFO:  [HINTS] PX PARALLEL(4) accepted.
                QUERY PLAN
-------------------------------------------
 PX Coordinator 8:1  (slice1; segments: 8)
   Output: id
   ->  Partial Seq Scan on public.t1
         Output: id
         Filter: (t1.id < 10)
 Optimizer: PolarDB PX Optimizer
(6 rows)

--disable
postgres=# set polar_enable_px = false;
SET
postgres=# set polar_px_enable_hint = true;
SET
postgres=# alter session disable parallel query;
ALTER SESSION

postgres=# explain (verbose, costs off)   select /*+ PARALLEL(4)*/ * from t1 where id < 10;
       QUERY PLAN
------------------------
 Seq Scan on public.t1
   Output: id
   Filter: (t1.id < 10)
(3 rows)

--force
postgres=# set polar_enable_px = false;
SET
postgres=# set polar_px_enable_hint = false;
SET
postgres=# alter session force parallel query;
ALTER SESSION

postgres=# explain (verbose, costs off)   select * from t1 where id < 10;
           QUERY PLAN
-------------------------------------------
 PX Coordinator 2:1  (slice1; segments: 2)
   Output: id
   ->  Partial Seq Scan on public.t1
         Output: id
         Filter: (t1.id < 10)
 Optimizer: PolarDB PX Optimizer
(6 rows)

postgres=# alter session force parallel query parallel 2;
ALTER SESSION
postgres=# explain (verbose, costs off)   select * from t1 where id < 10;
                QUERY PLAN
-------------------------------------------
 PX Coordinator 4:1  (slice1; segments: 4)
   Output: id
   ->  Partial Seq Scan on public.t1
         Output: id
         Filter: (t1.id < 10)
 Optimizer: PolarDB PX Optimizer
(6 rows)

Parámetros GUC

Establezca los parámetros GUC a nivel de sesión para habilitar o deshabilitar Elastic Parallel Query en la conexión actual.

postgres=# set polar_enable_px = true;
SET
postgres=# set polar_px_dop_per_node = 1;
SET
postgres=# explain (verbose, costs off)   select * from t1 where id < 10;
                QUERY PLAN
-------------------------------------------
 PX Coordinator 2:1  (slice1; segments: 2)
   Output: id
   ->  Partial Seq Scan on public.t1
         Output: id
         Filter: (t1.id < 10)
 Optimizer: PolarDB PX Optimizer
(6 rows)

Nivel de consulta

Anule el paralelismo de una sola consulta mediante hints de SQL. Primero, habilite la compatibilidad con hints:

set polar_px_enable_hint = true;  -- default: false

Sintaxis de hints compatible:

/*+ PARALLEL(DEFAULT) */   -- use the DoP from polar_px_dop_per_node
/*+ PARALLEL(integer) */   -- use the specified DoP
/*+ NO_PARALLEL(tablename) */  -- disable Elastic Parallel Query for the specified table
Estos hints son compatibles con la sintaxis de hints de Oracle. Elastic Parallel Query solo admite los hints PARALLEL y NO_PARALLEL. Al usar varios hints:
Solo el primer bloque de hints surte efecto cuando se encadenan varios bloques (por ejemplo, /*+A*/ /*+B*/ ).
Si aparecen varios hints PARALLEL en un mismo bloque con el mismo DoP, solo uno surte efecto. Si especifican valores de DoP distintos, ninguno surte efecto.
Si un hint PARALLEL y un hint NO_PARALLEL aparecen en el mismo bloque, el hint NO_PARALLEL no surte efecto.

Example:

postgres=# set polar_enable_px = false;
SET
postgres=# set polar_px_dop_per_node = 1;
SET
postgres=# set polar_px_enable_hint = true;
SET
postgres=# explain (verbose, costs off)   select * from t1 where id < 10;
       QUERY PLAN
------------------------
 Seq Scan on public.t1
   Output: id
   Filter: (t1.id < 10)
(3 rows)

postgres=# explain (verbose, costs off)   select /*+ PARALLEL(DEFAULT) */ * from t1 where id < 10;
                QUERY PLAN
-------------------------------------------
 PX Coordinator 2:1  (slice1; segments: 2)
   Output: id
   ->  Partial Seq Scan on public.t1
         Output: id
         Filter: (t1.id < 10)
 Optimizer: PolarDB PX Optimizer
(6 rows)

postgres=# explain (verbose, costs off)   select /*+ PARALLEL(4) */ * from t1 where id < 10;
                QUERY PLAN
-------------------------------------------
 PX Coordinator 8:1  (slice1; segments: 8)
   Output: id
   ->  Partial Seq Scan on public.t1
         Output: id
         Filter: (t1.id < 10)
 Optimizer: PolarDB PX Optimizer
(6 rows)

postgres=# explain (verbose, costs off)   select /*+ PARALLEL(0) */ * from t1 where id < 10;
       QUERY PLAN
------------------------
 Seq Scan on public.t1
   Output: id
   Filter: (t1.id < 10)
(3 rows)

postgres=# explain (verbose, costs off)   select /*+ NO_PARALLEL(t1) */ * from t1 where id < 10;
       QUERY PLAN
------------------------
 Seq Scan on public.t1
   Output: id
   Filter: (t1.id < 10)
(3 rows)

Comportamiento combinado: configuraciones de sistema, sesión y consulta

La siguiente tabla muestra cómo se determinan los resultados cuando interactúan las configuraciones de sistema, sesión y consulta.

**Sistema (polar_enable_px)**

Sesión

Consulta

Resultado

on

enable (DoP=X)

Ningún hint

Paralelo, DoP=X

on

enable (DoP=X)

PARALLEL(Y)

Paralelo, DoP=Y

on

enable (DoP=X)

NO_PARALLEL

Serial

on

disable (DoP=X)

Ningún hint

Serial

on

disable (DoP=X)

PARALLEL(Y)

Serial

on

disable (DoP=X)

NO_PARALLEL

Serial

on

FORCE PARALLEL Z

Ningún hint

Paralelo, DoP=Z

on

FORCE PARALLEL Z

PARALLEL(Y)

Paralelo, DoP=Y

on

FORCE PARALLEL Z

NO_PARALLEL

Serial

off

enable (DoP=X)

Ningún hint

Serial

off

enable (DoP=X)

PARALLEL(Y)

Paralelo, DoP=Y

off

enable (DoP=X)

NO_PARALLEL

Serial

off

disable (DoP=X)

Ningún hint

Serial

off

disable (DoP=X)

PARALLEL(Y)

Serial

off

disable (DoP=X)

NO_PARALLEL

Serial

off

FORCE PARALLEL Z

Ningún hint

Paralelo, DoP=Z

off

FORCE PARALLEL Z

PARALLEL(Y)

Paralelo, DoP=Y

off

FORCE PARALLEL Z

NO_PARALLEL

Serial

Ejemplo: habilitar Elastic Parallel Query para una tabla

El siguiente ejemplo demuestra el efecto de Elastic Parallel Query en una consulta de una sola tabla.

Cree una tabla de prueba con un millón de filas:

CREATE TABLE test(id int);
INSERT INTO test SELECT generate_series(1,1000000);
EXPLAIN SELECT * FROM test;

De forma predeterminada, Elastic Parallel Query está deshabilitado y el planificador utiliza un escaneo secuencial:

                       QUERY PLAN
--------------------------------------------------------
 Seq Scan on test  (cost=0.00..35.50 rows=2550 width=4)
(1 row)

Habilite Elastic Parallel Query para la tabla y vuelva a ejecutar la consulta:

ALTER TABLE test SET (px_workers=1);
SET polar_enable_px=on;
EXPLAIN SELECT * FROM test;

Ahora el plan utiliza un PX Coordinator, lo cual confirma que la ejecución paralela está activa:

QUERY PLAN
-------------------------------------------------------------------------------
 PX Coordinator 2:1  (slice1; segments: 2)  (cost=0.00..431.00 rows=1 width=4)
   ->  Seq Scan on test (scan partial)  (cost=0.00..431.00 rows=1 width=4)
 Optimizer: PolarDB PX Optimizer
(3 rows)

Para consultar los nodos de solo lectura disponibles y asignar nodos específicos a Elastic Parallel Query:

-- List all read-only nodes
SHOW polar_cluster_map;
 polar_cluster_map
-------------------
  node1,node2,node3
(1 row)

-- Use only node1 and node2
SET polar_px_nodes='node1,node2';

SHOW polar_px_nodes;
 polar_px_nodes
----------------
  node1,node2
(1 row)

Datos de rendimiento

Los siguientes resultados provienen de una prueba realizada con cinco nodos de solo lectura:

  • Escaneo completo de tabla (SELECT COUNT(*)): Elastic Parallel Query es 60 veces más rápido que la ejecución paralela en un solo nodo.

  • Consultas TPC-H: Elastic Parallel Query es 30 veces más rápido que la ejecución paralela en un solo nodo.

Esta prueba se basa en el benchmark TPC-H, pero no cumple con todos sus requisitos. Por lo tanto, es posible que los resultados no sean directamente comparables con los benchmarks TPC-H publicados.