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.
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
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.
O processo de execução do executor pode ser dividido nestas três etapas:
- 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
- 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.
- Limpando o executor: Recicle as informações de status global do executor e limpe o status de execução de cada nó do plano.
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.
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.
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.
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