Todos os produtos
Search
Central de documentação

PolarDB:Use o Elastic Parallel Query para consultas analíticas

Última atualização: Sep 02, 2026

PolarDB for PostgreSQL (Compatible with Oracle) e oferecem suporte ao Elastic Parallel Query para consultas analíticas, proporcionando recursos de processamento transacional e analítico híbrido (HTAP). Este tópico descreve como usar o Elastic Parallel Query para melhorar o desempenho de consultas analíticas.

Funcionamento

Quando uma consulta usa o Elastic Parallel Query, o nó coordenador de consulta (QC) divide o plano de execução em vários shards e os encaminha para nós de execução paralela (PX). Cada nó PX executa seu shard de plano atribuído e retorna os resultados parciais ao nó QC, que os agrega em um resultado final. O nó QC recebe a solicitação inicial da consulta.

跨机并行查询原理

No diagrama, RO1 é o nó QC. Ele recebe uma consulta, divide o plano de execução e direciona os shards do plano para três nós PX: RO2, RO3 e RO4. Cada nó PX executa seu shard de plano, lê os blocos de dados necessários do armazenamento compartilhado PolarFS e devolve os resultados ao nó QC. Em seguida, o nó QC agrega esses resultados e retorna a saída final.

Observações de uso

Devido ao alto consumo de recursos, esse recurso é adequado apenas para consultas analíticas pouco frequentes.

Controle granular

Controle o Elastic Parallel Query em três níveis de granularidade:

  • Nível de sistema: use parâmetros para definir se o Elastic Parallel Query está ativado para todas as consultas em todas as sessões.

  • Nível de sessão: use ALTER SESSION ou parâmetros GUC no nível de sessão para controlar o recurso na sessão atual.

  • Nível de consulta: aplique uma hint para especificar se uma consulta específica será executada em paralelo.

Parâmetros

Por padrão, o Elastic Parallel Query vem desativado no PolarDB for PostgreSQL (Compatible with Oracle) e no . Para usar esse recurso, configure os seguintes parâmetros:

Parâmetro

Descrição

polar_cluster_map

Lista os nomes de todos os nós somente leitura no cluster PolarDB for PostgreSQL (Compatible with Oracle) e . Esse parâmetro é atualizado automaticamente quando você adiciona um novo nó somente leitura.

Nota

Este parâmetro está disponível apenas para clusters criados com versão menor do kernel 1.1.20 (lançada em janeiro de 2022) ou anterior.

polar_px_nodes

Define quais nós somente leitura participam do Elastic Parallel Query. Por padrão, esse campo fica vazio, indicando que todos os nós somente leitura serão usados. Especifique os nós em uma lista separada por vírgulas. Exemplo:

SHOW polar_px_nodes ;
 polar_px_nodes
----------------

(1 row)
SET polar_px_nodes='node1,node2';
SHOW polar_px_nodes ;
     polar_px_nodes
    ----------------
     node1,node2
    (1 row)

polar_px_enable_replay_wait

No PolarDB for PostgreSQL (Compatible with Oracle) e no , pode haver atraso de replicação entre o nó primário e os nós somente leitura. Quando uma instrução DDL, como CREATE TABLE, é executada no nó primário, um nó somente leitura precisa reproduzir o log WAL correspondente antes que a nova tabela fique visível. Se você definir polar_px_enable_replay_wait como on, o Elastic Parallel Query impõe consistência forte. Ao rotear uma consulta paralela para um nó somente leitura, esse nó deve reproduzir os logs até a entrada mais recente registrada antes do início da consulta. Somente depois disso ele executa a consulta.

Caso a latência de replicação esteja alta, os nós somente leitura podem não visualizar os registros DDL mais recentes. Defina polar_px_enable_replay_wait como on para ativar a consistência forte, mas tenha em mente que isso pode reduzir o desempenho do Elastic Parallel Query.

Esse parâmetro pode ser ativado para funções específicas do banco de dados.

polar_px_max_workers_number

Define o número máximo de processos de trabalho PX para o Elastic Parallel Query em um único nó. O valor padrão é 30. A quantidade total de processos de trabalho PX para todas as sessões em um nó não pode ultrapassar esse limite.

polar_enable_px

Especifica se o Elastic Parallel Query deve ser ativado. O padrão é off.

polar_px_dop_per_node

Configura o grau de paralelismo (DoP) da sessão atual. O valor padrão é 1. Recomendamos definir esse valor como o número total de núcleos de CPU. Se você configurar esse parâmetro como N, a sessão iniciará N processos de trabalho PX em cada nó participante para executar a consulta.

px_workers

Indica se o Elastic Parallel Query se aplica a uma tabela específica. Por padrão, não se aplica. Como esse recurso consome muitos recursos do cluster, recomendamos ativá-lo apenas para tabelas onde for explicitamente configurado. Exemplo:

-- Allows Elastic Parallel Query for table t1.
ALTER TABLE t1 SET(px_workers=1);

-- Disables Elastic Parallel Query for table t1.
ALTER TABLE t1 SET(px_workers=-1);

-- Ignores Elastic Parallel Query for table t1 (default).
ALTER TABLE t1 SET(px_workers=0);

synchronous_commit

Especifica se o commit de uma transação precisa aguardar a gravação do log WAL em disco antes de retornar uma mensagem de sucesso ao cliente. Os valores válidos são:

  • off: Não aguarda a gravação do log WAL em disco. Também é possível usar 0, false ou no.

  • on: Valor padrão. Aguarda a gravação do log WAL em disco. Também é possível usar true, yes ou 1.

  • local: O registro WAL é gravado e liberado para o disco local.

  • remote_write: O registro WAL é enviado a um servidor standby, que confirma a gravação.

  • remote_apply: Retorna uma confirmação de commit ao nó primário somente após a transação ter sido reproduzida no servidor standby.

Nota

No modo PX, este parâmetro deve estar definido como on.

Exemplo

Este exemplo usa uma consulta simples de tabela única para demonstrar o uso do Elastic Parallel Query.

Contexto:

Execute os comandos abaixo para criar uma tabela test e inserir dados de amostra.

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

O Elastic Parallel Query vem desativado por padrão. O plano de execução da consulta exibe um Seq Scan nativo:

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

Siga estas etapas para ativar e usar o Elastic Parallel Query:

  1. Ative o Elastic Parallel Query para a tabela test.

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

    O resultado é o seguinte:

                                      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)
  2. Consulte os nomes de todos os nós somente leitura atuais.

    Execute o comando a seguir:

    SHOW polar_cluster_map;

    O resultado é o seguinte:

     polar_cluster_map
    -------------------
     node1,node2,node3
    (1 row)

    O resultado mostra que o cluster possui três nós somente leitura: node1, node2 e node3.

  3. Especifique que apenas os nós somente leitura node1 e node2 participem do Elastic Parallel Query.

    Execute o comando a seguir:

    SET polar_px_nodes='node1,node2';

    Consulte os nós participantes:

    SHOW polar_px_nodes ;

    O resultado é o seguinte:

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

Dados de desempenho

Os dados de desempenho a seguir foram registrados em um ambiente de teste com cinco nós somente leitura:

  • Em uma varredura completa de tabela (SELECT COUNT(*)), o Elastic Parallel Query foi 60 vezes mais rápido que uma consulta paralela de nó único.

  • Para cargas de trabalho TPC-H, o Elastic Parallel Query apresentou velocidade 30 vezes superior à de uma consulta paralela de nó único.

    Nota

    Neste exemplo, implementamos um teste baseado no benchmark TPC-H, mas ele não atende a todos os requisitos de um teste de benchmark TPC-H oficial. Portanto, os resultados podem não ser comparáveis aos resultados publicados do teste de benchmark TPC-H.

Aplicação de controle granular

Esta seção descreve como usar o Elastic Parallel Query em diferentes níveis de granularidade.

  • Controle no nível de sistema

    Controle o Elastic Parallel Query no nível do sistema definindo parâmetros GUC globais para ativar o recurso e especificar o grau de paralelismo (DoP).

    Example

    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)
  • Controle no nível de sessão

    Gerencie o Elastic Parallel Query para a sessão atual usando a sintaxe ALTER SESSION ou definindo parâmetros GUC no nível de sessão.

    • Sintaxe ALTER SESSION

      ALTER SESSION ENABLE PARALLEL QUERY
      ALTER SESSION DISABLE PARALLEL QUERY
      ALTER SESSION FORCE PARALLEL QUERY [PARALLEL integer]
      Nota
      • ALTER SESSION ENABLE PARALLEL QUERY permite que a sessão atual use hints ou sintaxe paralela para ativar consultas paralelas.

      • ALTER SESSION DISABLE PARALLEL QUERY força a sessão atual a usar execução serial. Consultas paralelas são desativadas e quaisquer hints ou sintaxes paralelas são ignorados.

      • ALTER SESSION FORCE PARALLEL QUERY [PARALLEL integer] obriga a sessão atual a usar execução paralela. Opcionalmente, especifique o grau de paralelismo (DoP) com PARALLEL integer. Se omitido, o sistema usa o DoP do parâmetro polar_px_dop_per_node.

        O DoP final é determinado pela seguinte ordem de prioridade: hint > cláusula FORCE PARALLEL > parâmetro polar_px_dop_per_node.

      Este comando afeta apenas a sessão atual e é redefinido após reconexão. O valor padrão é enable.

      Example

      --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)
    • Controle via parâmetro GUC

      Como os parâmetros GUC podem ser definidos tanto no nível de sistema quanto no de sessão, use-os também para controlar o comportamento de uma sessão específica.

      Example

      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)
  • Controle no nível de consulta

    Use uma hint SQL para controlar se uma consulta específica usa o Elastic Parallel Query e para definir seu grau de paralelismo (DoP). A sintaxe da hint é a seguinte:

    /*+ PARALLEL(DEFAULT) */
    /*+ PARALLEL(integer) */
    /*+ NO_PARALLEL(tablename) */
    Nota
    • PARALLEL(DEFAULT) determina que a consulta use o Elastic Parallel Query com o grau de paralelismo padrão definido pelo parâmetro polar_px_dop_per_node.

    • PARALLEL(integer) define que a consulta use o Elastic Parallel Query com o grau de paralelismo especificado.

    • NO_PARALLEL(tablename) impede que a tabela especificada seja consultada em paralelo. Se uma consulta incluir essa tabela, toda a consulta será executada serialmente.

    • Para compatibilidade com Oracle, aplicam-se as seguintes regras ao misturar hints paralelas:

      • Em múltiplos blocos de hint, como /+ A / /+ B / /+ C /, apenas o primeiro bloco tem efeito.

      • Se várias hints paralelas forem usadas em um único bloco, como /+ parallel(A) parallel(B) /, e os valores de DoP forem diferentes, haverá conflito e todas as hints paralelas serão ignoradas. Se os valores forem iguais, a hint será aplicada.

      • Caso uma hint parallel e uma hint no_parallel apareçam no mesmo bloco, como /+ parallel(A) no_parallel(t1) /, a hint no_parallel será ignorada.

    • Atualmente, apenas as hints parallel e no_parallel têm suporte para consultas paralelas.

    • Para usar hints no controle em nível de consulta, defina o parâmetro GUC polar_px_enable_hint como true. Por padrão, ele é false.

    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)
  • Efeitos combinados dos diferentes níveis

    Ao combinar configurações de diferentes níveis, o comportamento final segue as regras abaixo:

    Nível de sistema

    Nível de sessão

    Nível de consulta

    Resultado

    polar_enable_px=on

    polar_px_dop_per_node=X

    enable

    Sem hint

    Paralelo, DoP X

    polar_enable_px=on

    polar_px_dop_per_node=X

    enable

    PARALLEL(Y)

    Paralelo, DoP Y

    polar_enable_px=on

    polar_px_dop_per_node=X

    enable

    NO_PARALLEL

    Serial

    polar_enable_px=on

    polar_px_dop_per_node=X

    disable

    Sem hint

    Serial

    polar_enable_px=on

    polar_px_dop_per_node=X

    disable

    PARALLEL(Y)

    Serial

    polar_enable_px=on

    polar_px_dop_per_node=X

    disable

    NO_PARALLEL

    Serial

    polar_enable_px=on

    polar_px_dop_per_node=X

    FORCE PARALLEL Z

    Sem hint

    Paralelo, DoP Z

    polar_enable_px=on

    polar_px_dop_per_node=X

    FORCE PARALLEL Z

    PARALLEL(Y)

    Paralelo, DoP Y

    polar_enable_px=on

    polar_px_dop_per_node=X

    FORCE PARALLEL Z

    NO_PARALLEL

    Serial

    polar_enable_px=off

    polar_px_dop_per_node=X

    enable

    Sem hint

    Serial

    polar_enable_px=off

    polar_px_dop_per_node=X

    enable

    PARALLEL(Y)

    Paralelo, DoP Y

    polar_enable_px=off

    polar_px_dop_per_node=X

    enable

    NO_PARALLEL

    Serial

    polar_enable_px=off

    polar_px_dop_per_node=X

    disable

    Sem hint

    Serial

    polar_enable_px=off

    polar_px_dop_per_node=X

    disable

    PARALLEL(Y)

    Serial

    polar_enable_px=off

    polar_px_dop_per_node=X

    disable

    NO_PARALLEL

    Serial

    polar_enable_px=off

    polar_px_dop_per_node=X

    FORCE PARALLEL Z

    Sem hint

    Paralelo, DoP Z

    polar_enable_px=off

    polar_px_dop_per_node=X

    FORCE PARALLEL Z

    PARALLEL(Y)

    Paralelo, DoP Y

    polar_enable_px=off

    polar_px_dop_per_node=X

    FORCE PARALLEL Z

    NO_PARALLEL

    Serial