Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2023-05-19 GMT+08:00

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.

Figura 1 Processo de implementação do CBO

Calcite ajusta a sequência de junção da seguinte forma:

  1. Uma tabela é selecionada como a primeira tabela das tabelas a serem unidas.
  2. A segunda e terceira tabelas são selecionadas com base no custo. Desta forma, vários planos de execução diferentes são obtidos.
  3. 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.

Figura 2 Relação da 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 1 Filtragem de dados

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 3 Processo de junção quando o CBO está desativado

Figura 4 mostra o processo de junção quando o CBO está ativado.

Figura 4 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.