Todos os produtos
Search
Central de documentação

PolarDB:Push down join conditions to materialized derived tables

Última atualização: Jun 28, 2026

Quando uma consulta faz junção com uma tabela derivada, o otimizador normalmente materializa toda a tabela derivada primeiro e só depois aplica os filtros JOIN ON. O PolarDB pode, alternativamente, aplicar condições de junção elegíveis diretamente na tabela derivada antes da materialização, incluindo apenas as linhas correspondentes. Essa abordagem reduz o volume de dados que as operações de junção subsequentes processam, melhorando o desempenho da consulta.

Este recurso difere do push down de condição de junção (JPP) . Ele deriva condições de tabela única ao aproveitar equivalências de predicados WHERE e as insere nas tabelas derivadas — uma regra heurística que geralmente melhora o desempenho. Já o JPP foca em condições de múltiplas tabelas nos predicados ON e as transforma em subconsultas com base na estimativa de custo, sem garantia de melhoria no desempenho.

Como funciona

Considere uma consulta em que t1.a = 1 aparece na cláusula WHERE e dt.x > t1.a aparece na cláusula JOIN ON:

SELECT * FROM t1 LEFT JOIN (SELECT * FROM t2) dt ON dt.x > t1.a WHERE t1.a = 1;

O otimizador conhece o valor de t1.a = 1 no momento da consulta. Ele substitui esse valor no predicado ON, derivando dt.x > 1 — uma condição que depende exclusivamente da tabela derivada dt. Em seguida, essa condição derivada é aplicada em dt antes da materialização, fazendo com que a consulta se comporte como se tivesse sido escrita da seguinte forma:

SELECT * FROM t1 LEFT JOIN (SELECT * FROM t2 WHERE x > 1) dt ON dt.x > t1.a WHERE t1.a = 1;

Sem esse recurso, todas as linhas de t2 são materializadas primeiro, e o filtro dt.x > 1 é aplicado posteriormente.

Pré-requisitos

Antes de começar, verifique se seu cluster utiliza uma das seguintes versões do mecanismo. Para consultar sua versão, veja Consultar número da versão.

  • MySQL 8.0.1 com versão de revisão 8.0.1.1.44 ou posterior

  • MySQL 8.0.2 com versão de revisão 8.0.2.2.25 ou posterior

Limitações

O push down não tem suporte nos seguintes casos:

  • **A tabela derivada possui uma cláusula LIMIT.**

    SELECT * FROM t1 LEFT JOIN (SELECT c, MAX(d) FROM t2 GROUP BY c LIMIT 2) dt
    ON t1.a < dt.a AND t1.a = 1;
  • A condição referencia uma subconsulta ou uma função não determinística (como RAND()).

    SELECT * FROM t1 LEFT JOIN (SELECT c, MAX(d) FROM t2 GROUP BY c) dt
    ON t1.a < dt.a AND t1.a = RAND();
  • A condição referencia um procedimento armazenado ou função.

    SELECT * FROM t1 LEFT JOIN (SELECT c, MAX(d) FROM t2 GROUP BY c) dt
    ON t1.a < dt.a AND t1.a = f1();

Configure o recurso

Defina o parâmetro loose_join_cond_push_into_derived_mode de acordo com sua carga de trabalho. Para obter instruções, consulte Definir parâmetros de cluster e nó.

Parâmetro

Nível

Valores válidos

Descrição

loose_join_cond_push_into_derived_mode

Global

REPLICA_ON (padrão), ON, OFF

REPLICA_ON: ativa o push down apenas em nós somente leitura. ON: ativa o recurso de push down de condições. OFF: desativa o push down.

Verifique o efeito

Use EXPLAIN FORMAT=TREE para confirmar se as condições foram aplicadas à tabela derivada antes da materialização.

O push down ocorre quando todas as colunas na expressão da condição (ou suas colunas equivalentes) têm origem na tabela derivada materializada.

Configure as tabelas de exemplo:

CREATE TABLE t1 (a INT, b INT, c INT, d INT);
CREATE TABLE t2 (e INT, f INT, g INT);

Com o push down ativado (loose_join_cond_push_into_derived_mode = ON):

EXPLAIN FORMAT=TREE SELECT * FROM t1 LEFT JOIN (SELECT * FROM t2) dt ON dt.x > t1.a WHERE t1.a = 1;
-> Left hash join (no condition)
    -> Filter: (t1.a = 1)  (cost=0.55 rows=1)
        -> Table scan on t1  (cost=0.55 rows=3)
    -> Hash
        -> Table scan on dt
            -> Materialize
                -> Filter: (t2.x > 1)  (cost=0.45 rows=1)
                    -> Table scan on t2  (cost=0.45 rows=2)

A condição t2.x > 1 aparece dentro de Materialize, confirmando que a filtragem ocorre antes da materialização da tabela derivada.

Com o push down desativado (loose_join_cond_push_into_derived_mode = OFF):

EXPLAIN FORMAT=TREE SELECT * FROM t1 LEFT JOIN (SELECT * FROM t2) dt ON dt.x > t1.a WHERE t1.a=1;
-> Left hash join (no condition)
    -> Filter: (t1.a = 1)  (cost=0.55 rows=1)
        -> Table scan on t1  (cost=0.55 rows=3)
    -> Hash
        -> Filter: (dt.x > 1)
            -> Table scan on dt
                -> Materialize
                    -> Table scan on t2  (cost=0.45 rows=2)

O nó Filter: (dt.x > 1) aparece fora de Materialize, indicando que todas as linhas de t2 são materializadas primeiro e filtradas somente depois.