O partition pruning permite que o MaxCompute ignore partições fora das condições de filtro da consulta. Dessa forma, o SQL lê apenas as partições necessárias em vez de varrer toda a tabela. Quando o partition pruning falha, as consultas recorrem à varredura completa da tabela, o que aumenta custos e degrada o desempenho. Este tópico explica como verifique se o partition pruning funciona e identifica cenários comuns de falha.
Verifique o partition pruning com EXPLAIN
Execute a instrução EXPLAIN para visualize o plano de execução da consulta e confirme quais partições serão lidas.
Partition pruning ineficaz — uso de expressão não constante como filtro de partição:
explain
select seller_id
from xxxxx_trd_slr_ord_1d
where ds=rand();
O plano de execução mostra a leitura de todas as 1.344 partições da tabela xxxxx_trd_slr_ord_1d, indicando que o partition pruning não surtiu efeito.
Partition pruning eficaz — uso de valor constante como filtro de partição:
explain
select seller_id
from xxxxx_trd_slr_ord_1d
where ds='20150801';

O plano de execução indica a leitura apenas da partição 20150801 da tabela xxxxx_trd_slr_ord_1d.
Cenários em que o partition pruning não tem efeito
Uso inadequado de UDFs
Usar funções definidas pelo usuário (UDFs) ou certas funções integradas na expressão de filtro de partição pode impedir o funcionamento do partition pruning.
explain
select ...
from xxxxx_base2_brd_ind_cw
where ds = concat(SPLIT_PART(bi_week_dim(' ${bdp.system.bizdate}'), ',', 1), SPLIT_PART(bi_week_dim(' ${bdp.system.bizdate}'), ',', 2))
Execute EXPLAIN em qualquer consulta com UDFs na cláusula WHERE para confirme se o partition pruning está ativo.
Para obter detalhes sobre o partition pruning baseado em UDF, consulte a seção "WHERE" em WHERE .
Uso inadequado de joins
A posição das condições de filtro de partição — na cláusula ON ou na cláusula WHERE — determina quais tabelas se beneficiam do partition pruning:
Cláusula
WHERE: O partition pruning aplica-se a todas as tabelas unidas.Cláusula
ON: O partition pruning aplica-se apenas à tabela secundária (direita); a tabela primária (esquerda) ainda passa por varredura completa.
A tabela a seguir resume o comportamento do partition pruning nos diferentes tipos de JOIN:
|
Tipo de JOIN |
Filtro na cláusula ON |
Filtro na cláusula WHERE |
|
LEFT OUTER JOIN |
Apenas tabela direita |
Ambas as tabelas |
|
RIGHT OUTER JOIN |
Apenas tabela esquerda |
Ambas as tabelas |
|
FULL OUTER JOIN |
Sem pruning |
Ambas as tabelas |
Exemplos de LEFT OUTER JOIN
Filtro na cláusula ON — o pruning atua apenas na tabela direita:
set odps.sql.allow.fullscan=true;
explain
select a.seller_id
,a.pay_ord_pbt_1d_001
from xxxxx_trd_slr_ord_1d a
left outer join
xxxxx_seller b
on a.seller_id=b.user_id
and a.ds='20150801'
and b.ds='20150801';

O plano de execução demonstra que o partition pruning funciona na tabela direita, mas não na esquerda.
Filtro na cláusula WHERE — o pruning atua em ambas as tabelas:
set odps.sql.allow.fullscan=true;
explain
select a.seller_id
,a.pay_ord_pbt_1d_001
from xxxxx_trd_slr_ord_1d a
left outer join
xxxxx_seller b
on a.seller_id=b.user_id
where a.ds='20150801'
and b.ds='20150801';

O plano de execução confirma que o partition pruning atua em ambas as tabelas.
Recomendações
Use
EXPLAINpara validar o partition pruning antes de enviar o código SQL. Se o partition pruning falhar silenciosamente, o custo e o desempenho da consulta podem sofrer degradação significativa.Para ative o partition pruning baseado em UDF, modifique as classes da UDF ou adicione
set odps.sql.udf.ppr.deterministic = true;antes das instruções SQL. Para mais informações, consulte WHERE.