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 predicadosWHEREe 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 predicadosONe 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 |
|
|
Global |
|
|
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.