Explicação detalhada do mecanismo de execução vetorizado do data warehouse

Este artigo foi compartilhado pela Huawei Cloud Community " GaussDB (DWS) Vectorized Execution Engine detalhada explicação ", autor: yd_212508532.

Prefácio

  • Versão aplicável: [Função de linha de base]

A maioria dos mecanismos tradicionais de execução de linha adota um modo de execução de uma tupla por vez. Dessa forma, na maioria das vezes durante o processo de execução, a CPU não é usada para processar dados, mas mais para percorrer a árvore de execução. levará a uma baixa utilização efetiva da CPU. Diante de um grande número de chamadas de função em cenários OLAP, é necessária uma enorme sobrecarga. Para resolver este problema, um mecanismo de vetorização foi adicionado ao GaussDB (DWS). O mecanismo de vetorização usa um modo de execução de tuplas em lote por vez, o que pode reduzir bastante o custo de passagem dos nós de execução. Ao mesmo tempo, o mecanismo de vetorização também está naturalmente conectado ao armazenamento de colunas, facilitando o carregamento de dados de colunas vetorizadas nos nós de digitalização subjacentes. Armazenamento de colunas + mecanismo de execução vetorizado é uma das chaves de ouro que abre as portas para o desempenho OLAP!

Sobre tabelas de armazenamento de linhas e colunas

A tabela de armazenamento de linhas armazena tuplas em páginas de páginas por linhas. É usado principalmente em cenários TP onde os dados são atualizados frequentemente, há muitas adições, exclusões e modificações e os resultados da consulta envolvem múltiplas colunas da tabela.

Método de armazenamento de tabela de armazenamento de linha

As tabelas de armazenamento de colunas são armazenadas em colunas e os dados de cada coluna são armazenados em um arquivo. Usado principalmente em cenários AP.

  • O número de colunas da tabela é grande, o número de colunas acessadas é pequeno e o número de operações IO é reduzido.
  • Os dados da coluna são homogêneos, melhorando a taxa de compactação de dados
  • Operações baseadas em dados de lote de coluna, a taxa de acerto do cache da CPU é alta

Método de armazenamento de tabela de armazenamento de coluna

estrutura de execução

O executor é o centro de interação entre o otimizador e o mecanismo de armazenamento. Tomando como entrada a árvore do plano de execução gerada pelo otimizador, os dados são acessados ​​​​a partir do mecanismo de armazenamento e vários operadores de execução são operados de acordo com o plano para realizar o processamento de dados. Usando o modo Pipeline, o executor de linha opera uma tupla por vez e o executor de coluna opera um lote por vez. A camada superior impulsiona a camada inferior, permitindo que os dados fluam pela árvore de execução. Fornece operadores de execução para vários processamentos de dados. A figura abaixo mostra o fluxo de controle de cima para baixo e o fluxo de dados de baixo para cima.

Modo pipeline do executor

O processo de execução do executor pode ser dividido nestas três etapas:

  1. Inicialização do executor: Construa o estado global de informações de status do executor, percorra recursivamente cada nó da árvore do plano e inicialize seu estado de plano de informações de status de execução
  2. Execução do executor: As entradas do mecanismo de linha e do mecanismo de vetorização são independentes A partir do nó raiz da árvore do plano, ele percorre recursivamente os nós folha para obter uma tupla/lote. operadores de nó, um resultado tupla/lote é retornado até Não há mais tupla/lote.
  3. Limpando o executor: Recicle as informações de status global do executor e limpe o status de execução de cada nó do plano.

O processo de execução do executor

executor de coluna

O problema com o executor de linha é que a maior parte do processamento da CPU está no processo de percorrer a Árvore do Plano em vez de realmente processar os dados, e a utilização efetiva da CPU é baixa. Os cenários de aplicação exclusivos de tabelas de armazenamento de colunas exigem um mecanismo de vetorização de suporte para realmente aproveitar a melhoria de desempenho em cenários OLAP. Portanto, a ideia básica de transformar o executor de coluna é processar uma coluna de dados por vez.

Assim como o executor de linha, o escalonador do mecanismo de execução vetorizado segue o modo Pipeline, mas cada processamento e transferência de dados entre operadores é um lote por vez (ou seja, 1.000 linhas de dados), o que melhora a taxa de acertos da CPU e reduz as operações de leitura de IO . A estrutura do fluxo de dados do executor da coluna VectorBatch é mostrada na figura abaixo.

Estrutura de fluxo de dados do executor de coluna VectorBatch

Misturando linhas e colunas: operador adaptador

Alguns cenários de tabelas de armazenamento de colunas não suportam mecanismos de execução vetorizados, como: string_to_array, listagg, string_agg, etc.
GaussDB tem a capacidade de alternar automaticamente entre dois conjuntos de mecanismos de linha e coluna.

Comutação automática de motores de linha e coluna

Para dados de armazenamento de coluna, se houver apenas um mecanismo de linha, geralmente é necessário reconstruir os dados da coluna em tuplas para que o mecanismo de execução processe linha por linha. O processo de deformação da tupla afeta o desempenho do processamento de consulta de dados de armazenamento de coluna.

Desempenho do mecanismo de execução vetorizado

Comparando o desempenho do cálculo da mesma expressão x*(1-y) pelo mecanismo de armazenamento de linha e coluna, podemos ver que o operador Cstore Scan do mecanismo de armazenamento de coluna leva 85% menos tempo do que o operador Seq Scan do armazenamento de linha motor.

Comparação de desempenho do mecanismo de linha/coluna

As características da computação vetorial são: calcular vários valores ao mesmo tempo, reduzir chamadas de função e trocas de contexto e aproveitar ao máximo o cache da CPU e as instruções de execução vetorizadas para melhorar o desempenho.

Vantagens de desempenho dos mecanismos de execução vetorizados:

  • Um lote por vez, leia mais dados e reduza o número de leituras de E/S
  • Devido ao grande número de registros no lote, a taxa de acertos no cache da CPU correspondente aumenta.
  • O número de chamadas de função durante a execução do modo Pipeline é reduzido.
  • Combinado com tabelas de armazenamento de coluna para reduzir a deformação de tupla, ou seja, a sobrecarga de tempo de reconstrução de tuplas a partir de dados de armazenamento de coluna

Comparação de operadores de executores de linha/coluna

Os operadores de execução do mecanismo de vetorização são semelhantes aos do mecanismo de execução de linha, incluindo operadores de controle, operadores de varredura, operadores de materialização e operadores de conexão. Também será representado por nós, herdados de nós de execução de linha, e o processo de execução será recursivo. Os principais nós incluídos são: CStoreScan (varredura sequencial), CStoreIndexScan (varredura de índice), CStoreIndexHeapScan (usando Bitmap para obter tuplas), VecMaterial (materialização), VecSort (classificação), VecHashJoin (conexão de hash vetorizada), etc., que serão discutido um por um abaixo.

Operador de digitalização

O operador scan é usado para varrer os dados da tabela e, cada vez que obtém uma tupla como entrada do nó superior, ela existe no nó folha da árvore do plano de consulta. Ele pode não apenas varrer a tabela, mas também. verifica o conjunto de resultados da função, a estrutura da lista vinculada e o conjunto de resultados da consulta. Alguns dos operadores de varredura mais comuns são mostrados na tabela.

Operador (operador de armazenamento de linha/coluna) significado Aparecer cena
SeqScan/CStoreScan verificação sequencial O operador de varredura mais básico, usado para varrer tabelas físicas (varredura sequencial sem assistência de índice)
IndexScan/CStoreIndexScan varredura de índice É criado um índice sobre os atributos envolvidos nos critérios de seleção
IndexOnlyScan/CStoreIndexOnlyScan Retornar tupla diretamente do índice Colunas de índice cobrem completamente as colunas do conjunto de resultados
BitmapScan(BitmapIndexScan, BitmapHeapScan) / CStoreIndexHeapScan (CStoreIndexAnd, CStoreIndexOr,CStoreIndexCtidScan) Use Bitmap para obter tuplas BitmapIndexScan usa o índice no atributo para verificar e retorna o resultado como um bitmap. BitmapHeapScan obtém a tupla da saída de bitmap por BitmapIndexScan;
TidScan Obtenha tupla por tupla tid 1. Condições WHERE (como CTID = tid ou CTID IN (tid1, tid2,…)) ; 2.UPDATE/DELETE… WHERE CURRENT OF cursor
SubqueryScan/VecSubqueryScan verificação de subconsulta Use outra árvore de plano de consulta (subplano) como objeto de verificação para verificar tuplas
FunçãoScan verificação de função DE nome_da_função
ValoresScan Digitalize a lista vinculada de valores Digitalize a coleção de tuplas fornecida pela cláusula VALUES
ForeignScan/VecForeignScan Verificação de tabela externa Consultar tabela externa
CteScan/VecCteScan Verificação da tabela CTE Varredura de subconsultas definidas com a cláusula WITH em uma consulta SELECT

operador de conexão

O operador join corresponde à operação join na álgebra relacional Tomando como exemplo a tabela t1 join t2, os principais tipos de join centralizados são os seguintes: inner join, left join, right join, full join, semi join, anti join , e seus. os métodos de implementação incluem Nestloop, HashJoin, MergeJoin ;

Operador (operador de armazenamento de linha/coluna) significado Aparecer cena
NestLoop/VecNestLoop Conexão de loop aninhado, conexão violenta, verifica a tabela interna para cada linha Junção interna, junção externa esquerda, semi-junção, anti-junção
MergeJoin/VecMergeJoin Mesclar conexão (ordem de entrada), classificar tabelas internas e externas, posicionar a primeira e a última extremidade e conectar tuplas de uma só vez. Equijunção Junção interna, Junção externa esquerda, Junção externa direita, Junção externa completa, Semi-junção, Anti-junção
HashJoin/VecHashjoin Junção de hash, as tabelas interna e externa usam o valor hash da coluna de junção para criar uma tabela hash, e os mesmos valores devem estar no mesmo balde de hash. Equijunção Junção interna, Junção externa esquerda, Junção externa direita, Junção externa completa, Semi-junção, Anti-junção

operador de materialização

Operadores materializados são um tipo de nó que pode armazenar tuplas em cache. Durante a execução, muitos operadores físicos estendidos precisam primeiro obter todas as tuplas antes de poderem operar (como operações de função agregada, classificação sem assistência de índice, etc.). Isso requer o uso de operadores de materialização para armazenar as tuplas em cache;

Operador (operador de armazenamento de linha/coluna) significado Aparecer cena
Material/VecMaterial materializar Resultados do nó filho em cache
Classificar/VecSort organizar Cláusula ORDER BY, operação de conexão, operação de agrupamento, operação de conjunto, com Único
Grupo/VecGrupo Operações de agrupamento Cláusula filha GROUP BY
Agregação Agg/Vec Executar função agregada 1. Funções de agregação como COUNT/SUM/AVG/MAX/MIN; 2. Cláusula DISTINCT 3. UNION para remover duplicatas;
WindowAgg/VecWindowAgg função de janela Cláusula JANELA
Único/VecÚnico Deduplicação (o nível inferior foi classificado) 1. Cláusula DISTINCT; 2. Desduplicação UNION;
Cerquilha Nó auxiliar HashJoin Construa uma tabela hash e coopere com HashJoin
SetOp/VecSetOp Lidar com operações de cobrança INTERSETAR/INTERSECTAR TODOS, EXCETO/EXCETO TODOS
BloquearRows Tratamento de bloqueios em nível de linha SELECIONE… PARA COMPARTILHAR/ATUALIZAR

operador de controle

Operadores de controle são um tipo de nó usado para lidar com situações especiais e implementar processos de execução especiais.

Operador (operador de armazenamento de linha/coluna) significado Aparecer cena
Resultado/VecResult Calcule diretamente 1. Não inclui varredura de tabela; 2. Existe apenas uma cláusula VALUES na instrução INSERT 3. Quando Append/MergeAppend é o nó raiz do plano (push-up de projeção);
ModificarTabela INSERT/UPDATE/DELETE nó superior INSERIR/ATUALIZAR/EXCLUIR
Anexar/VecAppend Adição 1. UNION(ALL); 2. Tabela de herança
MesclarAnexar Anexar (entrada solicitada) 1. UNION(ALL); 2. Tabela de herança
União Recursiva Tratamento de subconsultas UNION definidas recursivamente na cláusula WITH COM RECURSIVO… SELECT… instrução
BitmapE Operação AND lógica de bitmap BitmapScan para digitalização de índice multidimensional
BitmapOu Operação lógica OR de bitmap BitmapScan para digitalização de índice multidimensional
Limite/VecLimite Tratamento de cláusulas LIMIT DESLOCAMENTO… LIMITE…

Outras operadoras

Outros operadores incluem operadores Stream e operadores como RemoteQuery

Operador (operador de armazenamento de linha/coluna) significado Aparecer cena
Fluxo Troca de dados de vários nós Execute um plano de consulta distribuída e haja troca de dados entre nós
Iterador de partição Iterador particionado Verificação da tabela de partições, verificação iterativa de cada partição
VecToRow/RowToVec Coluna para linha/Linha para coluna Cena mista de fileiras e fileiras
DfsScan/DfsIndexScan Verificação de tabela (índice) HDFS Verificação de tabela HDFS

A evolução da vetorização Gaussdb

Após o mecanismo de vetorização de primeira geração, o GaussDB desenvolveu motores de vetorização com maior desempenho: mecanismo de vetorização Sonic e mecanismo de vetorização Turbo.
Para melhorar o desempenho da execução OLAP, o GaussDB continua a evoluir no caminho do armazenamento de colunas + mecanismo de execução vetorizado e cálculo em lote:

  • Operador de fluxo + estrutura de execução distribuída suporta fluxo de dados entre vários nós
  • SMP, paralelismo multithread dentro do nó, aproveitando ao máximo os recursos de hardware ociosos
  • A tecnologia LLVM, uma nova estrutura de geração de código, compilador JIT (just in time), elimina gargalos de deformação de tupla
  • O mecanismo de vetorização Sonic vetoriza ainda mais os operadores HashAgg e HashJoin e implementa diferentes Arrays para calcular dados de acordo com diferentes tipos de cada coluna.
  • O mecanismo de vetorização Turbo de nova geração vetoriza ainda mais a maioria dos operadores. Com base no mecanismo Sonic, otimização nula, otimização de números inteiros grandes, otimização de fluxo, otimização de classificação, etc.

Resumir

Este artigo apresenta o mecanismo de execução vetorizada GaussDB e discorre sobre sua estrutura, princípios, visão geral de cada operador e melhoria de desempenho.

 

Clique para seguir e conhecer as novas tecnologias da Huawei Cloud o mais rápido possível~

 

Decidi desistir do código aberto Hongmeng Wang Chenglu, o pai do código aberto Hongmeng: Hongmeng de código aberto é o único evento de software industrial de inovação arquitetônica na área de software básico na China - o OGG 1.0 é lançado, a Huawei contribui com todo o código-fonte. Google Reader é morto pela "montanha de merda de código" Fedora Linux 40 é lançado oficialmente Ex-desenvolvedor da Microsoft: o desempenho do Windows 11 é "ridiculamente ruim" Ma Huateng e Zhou Hongyi apertam as mãos para "eliminar rancores" Empresas de jogos conhecidas emitiram novos regulamentos : os presentes de casamento dos funcionários não devem exceder 100.000 yuans Ubuntu 24.04 LTS lançado oficialmente Pinduoduo foi condenado por concorrência desleal Compensação de 5 milhões de yuans
{{o.nome}}
{{m.nome}}

Acho que você gosta

Origin my.oschina.net/u/4526289/blog/11054711
Recomendado
Clasificación