Princípios do CBO do Hive
Princípios do CBO do Hive
CBO é a abreviação de Cost-Based Optimization.
Isso otimizará o seguinte:
durante a compilação, o CBO calcula a sequência de junção mais eficiente com base em tabelas e condições de consulta envolvidas em instruções de consulta para reduzir o tempo e os recursos necessários para a consulta.
No Hive, o CBO é implementado da seguinte forma:
o Hive usa o componente de código aberto Apache Calcite para implementar o CBO. As instruções SQL são primeiro convertidas em Árvores de Sintaxe Abstratas do Hive (ASTs) e depois em RelNodes que podem ser identificadas por Calcite. Depois que o RelNodes ajusta a sequência de junção, os RelNodes são convertidos em ASTs pelo Hive para continuar a otimização lógica e física. Figura 1 mostra o fluxo de trabalho.
Calcite ajusta a sequência de junção da seguinte forma:
- Uma tabela é selecionada como a primeira tabela das tabelas a serem unidas.
- A segunda e terceira tabelas são selecionadas com base no custo. Desta forma, vários planos de execução diferentes são obtidos.
- Um plano com os custos mínimos é calculado e serve como a sequência final.
O método de cálculo de custos é o seguinte:
na versão atual, os custos são medidos com base no número de entradas de dados após a adesão. Menos entradas de dados significam menos custo. O número de entradas de dados associadas depende da taxa de seleção de tabelas associadas. O número de entradas de dados em uma tabela é obtido com base nas estatísticas de nível de tabela.
O número de entradas de dados em uma tabela após a filtragem é estimado com base nas estatísticas de nível de coluna, incluindo os valores máximos (máx.), valores mínimos (min.) e Número de Valores Distintos (NDV).
Por exemplo, existe uma tabela table_a cujo número total de registros de dados é 1.000.000 e NDV é 50. As condições de consulta são as seguintes:
Select * from table_a where colum_a='value1';
O número estimado de entradas de dados consultadas é: 1.000.000 × 1/50 = 20.000. A taxa de seleção é de 2%.
A seguir, o TPC-DS Q3 é um exemplo para descrever como o CBO ajusta a sequência de junção:
select dt.d_year, item.i_brand_id brand_id, item.i_brand brand, sum(ss_ext_sales_price) sum_agg from date_dim dt, store_sales, item where dt.d_date_sk = store_sales.ss_sold_date_sk and store_sales.ss_item_sk = item.i_item_sk and item.i_manufact_id = 436 and dt.d_moy = 12 group by dt.d_year , item.i_brand , item.i_brand_id order by dt.d_year , sum_agg desc , brand_id limit 10;
Explicação da instrução: esta instrução indica que a junção interna é executada para três tabelas: tabela store_sales é uma tabela de fatos com cerca de 2.900.000.000 entradas de dados, tabela date_dim é uma tabela de dimensão com cerca de 73.000 entradas de dados, e a tabela item é uma tabela de dimensão com cerca de 18.000 entradas de dados. Cada tabela tem condições de filtragem. Figura 2 mostra a relação de junção.
O CBO deve primeiro selecionar as tabelas que trazem o melhor efeito de filtragem para a junção.
Analisando o min, máx, NDV e o número de entradas de dados, o CBO estima as taxas de seleção de diferentes tabelas de dimensão, como mostrado em Tabela 1.
Tabela |
Número de entradas de dados originais |
Número de entradas de dados após filtragem |
Taxa de seleção |
---|---|---|---|
date_dim |
73.000 |
6.200 |
8,5% |
item |
18.000 |
19 |
0,1% |
A taxa de seleção pode ser estimada da seguinte forma: taxa de seleção = número de entradas de dados após a filtragem/número de entradas de dados originais
Conforme mostrado na tabela anterior, a tabela item tem um efeito de filtragem melhor. Portanto, o CBO ingressa na tabela item primeiro antes de ingressar na tabela date_dim.
Figura 3 mostra o processo de junção quando o CBO está desabilitado.
Figura 4 mostra o processo de junção quando o CBO está ativado.
Depois que o CBO está ativado, o número de entradas de dados intermediários é reduzido de 495.000.000 para 2.900.000 e, assim, o tempo de execução pode ser notavelmente reduzido.