Este tópico descreve o recurso In-Memory Column Index (IMCI) do PolarDB for PostgreSQL, que ajuda você a lidar melhor com consultas complexas.
Introdução
O recurso IMCI do PolarDB for PostgreSQL permite processar tanto o processamento transacional online de alta concorrência (OLTP) quanto a análise complexa de dados (OLAP) em um único sistema. Você não precisa mais manter um sistema externo separado, caro e arquitetonicamente complexo para consultas analíticas. Isso simplifica sua arquitetura de dados, reduz os custos de operações e manutenção (O&M) e viabiliza a análise em tempo real de grandes volumes de dados corporativos.
Em comparação com o mecanismo de armazenamento orientado a linhas, o recurso IMCI melhora o desempenho das consultas em duas áreas principais: IMCIs na camada de armazenamento e operadores vetorizados na camada do mecanismo de execução, também conhecida como mecanismo de execução vetorizada. Essas melhorias superam efetivamente as limitações do mecanismo de armazenamento orientado a linhas no tratamento de consultas complexas. Em um teste de desempenho TPC-H que utiliza um conjunto de dados de 100 GB e um cluster de 32 núcleos com 256 GB, o mecanismo orientado a colunas do PolarDB for PostgreSQL oferece um desempenho de consulta mais de 60 vezes superior ao do mecanismo de armazenamento orientado a linhas. Para obter mais informações, consulte IMCI performance test results.
Como funciona
Otimização da arquitetura
O PolarDB for PostgreSQL otimiza as camadas do mecanismo de execução e de armazenamento do recurso IMCI para processar melhor as consultas complexas.
-
Camada do mecanismo de execução
Diferentemente do mecanismo de armazenamento orientado a linhas, o mecanismo de execução vetorizada usa instruções SIMD da CPU para processar dados em lotes. Uma única instrução da CPU pode processar várias linhas de dados em paralelo. Isso ajuda a reduzir o tempo de chamadas de função e evita problemas de cache miss.
O mecanismo vetorizado alcança a vetorização completa dos operadores de consulta. Por exemplo, ele vetoriza operadores como
Scan,Group By,Order By,Hash Join,Filter,CounteSum. Isso permite que o mecanismo aceite entradas de dados em lote e os processe usando instruções SIMD.
-
Camada de armazenamento
Utiliza um formato de armazenamento orientado a colunas, mais adequado para operadores vetorizados do que a estrutura de armazenamento heap orientada a linhas.
O formato de armazenamento orientado a colunas é implementado por meio de índices, que são os IMCIs. Os IMCIs são semelhantes aos índices B-tree e GiST, mas possuem estruturas de armazenamento e cenários de aplicação diferentes. É possível usar os IMCIs diretamente. O mecanismo de armazenamento orientado a linhas utiliza índices B-tree e GiST. Uma tabela pode conter tanto IMCIs quanto outros tipos de índices para lidar com diversas consultas. O otimizador do PolarDB for PostgreSQL seleciona o índice mais adequado com base no custo da consulta.
Conforme mostrado na figura a seguir, você pode criar um índice B-tree na coluna c2 da tabela t para consultas pontuais (SELECT * FROM t WHERE c2=10) e um IMCI nas colunas c4 e c5 para consultas estatísticas (SELECT c4, SUM(c5) FROM t GROUP BY c4). O otimizador de consultas determina o índice mais eficiente a ser usado com base no custo da instrução SQL.
Sincronização linha-coluna em tempo real
Os dados em um IMCI são armazenados em formato colunar no banco de dados. Os dados são primeiramente gravados em uma tabela orientada a linhas e depois sincronizados com o IMCI por meio do mecanismo de indexação. Esse processo é conhecido como sincronização linha-coluna. O recurso IMCI do PolarDB for PostgreSQL oferece um mecanismo eficiente, automatizado e em tempo real para sincronização linha-coluna, eliminando a necessidade de pipelines adicionais ou atualizações manuais dos dados orientados a colunas.
O mecanismo de sincronização linha-coluna analisa logs de Write-Ahead Logging (WAL) para recuperar dados modificados, que são então gravados no IMCI de forma assíncrona. Esse processo tem impacto mínimo no desempenho e na carga do mecanismo de armazenamento orientado a linhas, inferior a 3%. Como o recurso IMCI do PolarDB for PostgreSQL pode coexistir com o mecanismo de armazenamento orientado a linhas no mesmo nó, o processo de análise de logs WAL é otimizado. Apesar da natureza assíncrona do processo de conversão linha-coluna, ele ainda consegue atingir sincronização em tempo real com latência de alguns milissegundos a alguns segundos, dependendo da carga de gravação. Para obter mais informações sobre como otimizar a sincronização linha-coluna, consulte Improve the real-time performance of IMCIs.
Formato do product
O recurso IMCI aplica-se a todos os nós implantados em um cluster PolarDB for PostgreSQL. Portanto, todos os nós de computação no cluster possuem tanto um mecanismo de armazenamento orientado a linhas quanto um IMCI. Nesse modo, o sistema toma as seguintes decisões ao executar uma instrução SQL:
Selecione um nó de computação para execução.
Selecione um mecanismo de execução no nó.
Selecionar um nó de computação
Quando o sistema executa uma instrução SQL relacionada a um IMCI em um cluster PolarDB que contém vários nós, ele deve selecionar um nó de computação para a execução.
Todas as instruções de modificação de dados, como instruções de Data Definition Language (DDL) e Data Manipulation Language (DML), são executadas no nó RW. O nó RW então seleciona o mecanismo de execução apropriado com base em condições específicas.
O nó RW cria o IMCI e realiza a sincronização em tempo real para ele.
Para todas as instruções SQL somente leitura, você pode configure the database proxy para determinar qual nó usar na execução.
Selecionar um mecanismo de execução
O nó de computação seleciona um mecanismo de execução para processar a instrução SQL.
Para instruções DDL como
CREATE TABLEeALTER TABLE, o mecanismo de armazenamento orientado a linhas é utilizado. No entanto, para a instruçãoCREATE TABLE AS SELECT, o sistema decide se deve usar um IMCI com base na complexidade da subconsultaSELECT.Para instruções DML como
INSERT,UPDATEeDELETE, o sistema utiliza o mecanismo de armazenamento orientado a linhas.Para instruções de Data Query Language (DQL) como
SELECT, o sistema decide se deve usar um IMCI com base no custo da consulta e em parâmetros específicos. Geralmente, um custo de consulta mais alto indica maior probabilidade de uso de um IMCI. Se o IMCI falhar ao executar a instruçãoSELECT, o sistema utiliza o mecanismo de armazenamento orientado a linhas para executar a instrução novamente.
Principais recursos e vantagens
-
Alto desempenho
Em comparação com o mecanismo de armazenamento orientado a linhas, os IMCIs aumentam significativamente o desempenho das consultas SQL. Eles podem acelerar a execução de consultas complexas em mais de 100 vezes em relação ao mecanismo orientado a linhas.
-
Custo-benefício
Para otimizar consultas, crie IMCIs para colunas relacionadas em vez de criar para a tabela inteira.
Os IMCIs ocupam menos espaço de armazenamento do que os índices orientados a linhas. Dependendo do tipo de dados de uma coluna específica, um IMCI ocupa apenas 10% a 50% do espaço de armazenamento ocupado por um índice orientado a linhas.
-
Facilidade de uso
O mecanismo vetorizado é totalmente compatível com o PostgreSQL nativo e pode ser usado da mesma maneira.
Gerencie os IMCIs como índices nativos do PostgreSQL, com suporte a instruções como
CREATE INDEXeDROP INDEX. Nenhuma instrução adicional é necessária. Para obter mais informações, consulte Enable and use IMCIs.Os IMCIs têm alta compatibilidade com tipos de dados e sintaxe do PostgreSQL. Use IMCIs para aceleração sem precisar modificar instruções SQL existentes.
Configure parâmetros para especificar quais instruções SQL podem usar IMCIs de maneira granular, como todas as instruções SQL, instruções SQL em uma sessão ou instruções SQL específicas com hints. Para obter mais informações, consulte Enable and use IMCIs.
-
Manutenção de IMCIs em tempo real
A consistência de dados entre os dados orientados a linhas e os IMCIs é mantida automaticamente. Isso elimina a necessidade de configurar conversões ou sincronizações manuais entre dados orientados a linhas e orientados a colunas.
Os dados inseridos na tabela orientada a linhas são sincronizados com o IMCI com latência de alguns milissegundos a alguns segundos. Ajuste o desempenho da sincronização de dados conforme as cargas de trabalho. Para obter mais informações, consulte Enable and use IMCIs.
-
Consistência
Os seguintes níveis de consistência para IMCIs e dados orientados a linhas estão disponíveis para atender a diversas necessidades de negócios.
Consistência eventual (padrão): nível adequado para consultas que envolvem cargas pesadas de gravação, mas têm baixos requisitos de desempenho em tempo real.
Consistência forte: este nível retorna resultados de consulta somente após os dados do IMCI estarem consistentes com os dados orientados a linhas. Para obter mais informações, consulte Enable and use IMCIs.
-
Compatibilidade com vários métodos de uso
Suporta a sintaxe
Prepared Statement.-
Oferece suporte à aceleração de instruções SELECT dentro de blocos de transação.
NotaA instrução SELECT deve ser uma instrução SQL de leitura antes de gravação dentro do bloco de transação.
Compatível com tabelas particionadas e tabelas particionadas gerenciadas por pg_pathman. O pruning de partições também é suportado. Para obter mais informações, consulte Use IMCIs for partitioned tables.
Permite a aceleração de consultas multimodais espaço-temporais.
Casos de uso comuns
O recurso IMCI do PolarDB for PostgreSQL fornece uma experiência completa de Hybrid Transactional/Analytical Processing (HTAP), adequada para diversos cenários de negócios:
Cenários HTAP: por exemplo, quando você precisa realizar grandes volumes de operações CRUD transacionais diariamente e, ao mesmo tempo, gerar relatórios em tempo real da última hora. O recurso IMCI do PolarDB for PostgreSQL não apenas lida com ambas as cargas de trabalho de forma eficiente, mas também simplifica a arquitetura do sistema. Você não precisa mais manter um sistema separado para a parte OLAP em tempo real de suas consultas analíticas.
-
Aceleração de consultas lentas: ideal para acelerar consultas tradicionalmente lentas em mecanismos de armazenamento orientado a linhas, tais como:
Agregações de tabela completa (
COUNT,SUM,AVG).Operações complexas de
GROUP BYeORDER BY.Operações de
JOINentre múltiplas tabelas.Consultas com condições de filtro dinâmicas, nas quais um índice composto seria pouco flexível.
Consultas multimodais e geoespaciais: consulte dados JSON aninhados de forma eficiente ou realize análises estatísticas em dados geoespaciais.
Aceleração de ETL: aproveite os poderosos recursos computacionais do IMCI para executar transformações complexas de dados e processos de ETL diretamente no banco de dados.
Faturamento
Os IMCIs podem ser executados diretamente em nós orientados a linhas ou em nós somente leitura adicionados para IMCI.
Uso de IMCIs em nós existentes: gratuito.
Adição de nós somente leitura dedicados para IMCI: Standard compute node fees aplicam-se aos recursos de computação adicionais. Além disso, o IMCI consumirá espaço de armazenamento adicional, o que incorre em storage fees padrão.
Isolamento de carga de trabalho
Para isolamento completo da carga de trabalho, adicione nós somente leitura dedicados para IMCI. Isso garante que as consultas de processamento analítico (AP) não afetem o desempenho das suas cargas de trabalho de processamento transacional (TP). Consulte Impact on business para obter detalhes.