Todos os produtos
Search
Central de documentação

PolarDB:Use o IMCI para acelerar ETL

Última atualização: Jun 28, 2026

O recurso ETL from IMCI transfere a fase SELECT das instruções CREATE TABLE ... SELECT e INSERT ... SELECT para nós de column store somente leitura. O nó primário recebe os resultados pela rede interna e os grava na tabela de destino, permitindo usar a aceleração do In-memory Column Index (IMCI) sem alterar as consultas de ETL.

Como funciona

Data is read from read-only column store nodes and written to tables

Casos de uso

Use o ETL from IMCI quando houver condições de consulta complexas e o tempo de execução das instruções SQL for longo, mas o volume de dados retornado for pequeno:

  • Pré-agregação de relatórios de BI: Resuma grandes tabelas de fatos em agregações diárias ou mensais com INSERT INTO ... SELECT. Os relatórios downstream consultam diretamente a pequena tabela de resultados, evitando varreduras completas repetidas nos dados de origem.

  • Materialização de tabelas intermediárias: Pré-calcule e armazene resultados complexos de junção ou agregação. Assim, as consultas subsequentes são executadas em uma tabela compacta, em vez de varrer gigabytes de dados brutos a cada execução.

Evite o ETL from IMCI nos seguintes cenários:

  • Consultas simples: Ler dados em nós remotos de column store somente leitura gera sobrecarga adicional de transmissão de rede e análise do conjunto de resultados, o que pode degradar o desempenho.

  • Conjuntos de resultados grandes: Se a consulta retornar um volume elevado de dados, ler informações nos nós remotos de column store somente leitura, enviá-las ao nó primário e gravá-las na tabela pode causar degradação de desempenho.

Pré-requisitos

Antes de começar, verifique se o cluster PolarDB usa uma das seguintes versões:

  • PolarDB for MySQL 8.0.1 com versão de revisão 8.0.1.1.29 ou posterior

  • PolarDB for MySQL 8.0.2 com versão de revisão 8.0.2.2.12 ou posterior

Para verificar sua versão, consulte a seção "Query the engine version" em Versões do mecanismo.

Limitações

O ETL from IMCI aplica-se apenas às seguintes instruções SQL:

  • CREATE TABLE table_name [AS] SELECT ...

  • INSERT ... SELECT ...

Ative o ETL from IMCI

Dois parâmetros controlam esse recurso:

Parâmetro

Descrição

Valores válidos

Padrão

etl_from_imci

Define se os dados devem ser lidos dos nós de column store somente leitura

ON, OFF, FORCED

OFF

etl_from_imci_compress

Define se os arquivos devem ser compactados durante a leitura dos nós de column store somente leitura

ON, OFF

OFF

**Valores de etl_from_imci:**

  • ON: Encaminha o SELECT para os nós de column store somente leitura.

  • OFF (padrão): Executa o SELECT no nó primário.

  • FORCED: Encaminha o SELECT para os nós de column store somente leitura mesmo que a instrução esteja dentro de uma transação ativa.

Defina o parâmetro em qualquer um dos três níveis. Níveis mais altos afetam um escopo mais amplo; dicas no nível de instrução substituem as configurações de sessão e globais para uma única consulta.

Nível global — aplica-se a todas as instruções CREATE TABLE ... SELECT e INSERT ... SELECT no cluster:

SET GLOBAL etl_from_imci = ON;

Nível de sessão — aplica-se apenas às instruções da sessão atual:

SET etl_from_imci = ON;

Nível de instrução — aplica-se a uma única instrução por meio de uma dica do otimizador:

CREATE TABLE t2 SELECT /*+ SET_VAR(etl_from_imci=ON) */ * FROM t1 WHERE 'A' = 'a';

Verifique se o recurso está ativo

Confirme o roteamento com EXPLAIN

Antes de executar um job de ETL longo, confirme se a fase SELECT será roteada para o column store. Execute EXPLAIN na parte SELECT da instrução e verifique se a saída contém indicadores de execução no column store.

Monitore com SHOW processlist

Durante a execução de uma instrução ETL, execute SHOW processlist no nó primário. Quando o roteamento estiver ativo, a coluna de estado exibirá ETL FROM IMCI.

ETL FROM IMCI

Exemplo de ponta a ponta

O exemplo a seguir materializa um resumo diário de taxas a partir de uma tabela bruta de transações. A agregação SELECT é executada no nó de column store somente leitura; o nó primário grava o resultado na tabela de resumo.

Crie as tabelas de source e de destino:

CREATE TABLE transaction_detail (
    ts          DATETIME,
    customer_id VARCHAR(20),
    fee         DECIMAL(20, 2)
);

CREATE TABLE daily_summary (
    rec_date    DATE,
    customer_id VARCHAR(20),
    daily_fee   DECIMAL(20, 2)
);

Ative o ETL from IMCI para a sessão e insira os dados agregados:

SET etl_from_imci = ON;

INSERT INTO daily_summary (rec_date, customer_id, daily_fee)
SELECT
    DATE(ts),
    customer_id,
    SUM(fee)
FROM transaction_detail
WHERE DATE(ts) > '2024-01-01'
GROUP BY DATE(ts), customer_id;

Consulte a tabela de resumo compacta para obter totais mensais:

SELECT
    MONTH(rec_date),
    customer_id,
    SUM(daily_fee)
FROM daily_summary
GROUP BY MONTH(rec_date), customer_id;

A agregação em INSERT INTO ... SELECT é executada no nó de column store e conclui em menos de um segundo para conjuntos de dados de 10 GB (consulte Comparação de desempenho). Os rollups mensais subsequentes são executados na pequena tabela de resumo, e não em todo o histórico de transações.

Comparação de desempenho

Os resultados abaixo usam 10 GB de dados gerados com o TPC Benchmark H (TPC-H) para comparar tempos de consulta (em segundos) em agregações complexas.

Consulta retornando 1 linha:

SELECT
    SUM(l_extendedprice * l_discount) AS revenue
FROM
    lineitem
WHERE
    l_shipdate >= DATE '1994-01-01'
    AND l_shipdate < DATE '1994-01-01' + INTERVAL '1' YEAR
    AND l_discount BETWEEN .06 - 0.01 AND .06 + 0.01
    AND l_quantity < 24

Cenário

Tempo (s)

Consulta direta no nó de column store somente leitura

0,05

CREATE TABLE ... SELECT no nó primário, ETL from IMCI desativado

>60

CREATE TABLE ... SELECT no nó primário, ETL from IMCI ativado

0,17

INSERT ... SELECT no nó primário, ETL from IMCI desativado

>60

INSERT ... SELECT no nó primário, ETL from IMCI ativado

0,08

Consulta retornando 4 linhas:

SELECT
    l_returnflag,
    l_linestatus,
    SUM(l_quantity)                                       AS sum_qty,
    SUM(l_extendedprice)                                  AS sum_base_price,
    SUM(l_extendedprice * (1 - l_discount))               AS sum_disc_price,
    SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
    AVG(l_quantity)                                       AS avg_qty,
    AVG(l_extendedprice)                                  AS avg_price,
    AVG(l_discount)                                       AS avg_disc,
    COUNT(*)                                              AS count_order
FROM
    lineitem
WHERE
    l_shipdate <= DATE '1998-12-01' - INTERVAL '90' DAY
GROUP BY
    l_returnflag,
    l_linestatus
ORDER BY
    l_returnflag,
    l_linestatus

Cenário

Tempo (s)

Consulta direta no nó de column store somente leitura

0,58

CREATE TABLE ... SELECT no nó primário, ETL from IMCI desativado

>60

CREATE TABLE ... SELECT no nó primário, ETL from IMCI ativado

0,64

INSERT ... SELECT no nó primário, ETL from IMCI desativado

>60

INSERT ... SELECT no nó primário, ETL from IMCI ativado

0,58

Consulta retornando 27.840 linhas:

SELECT
    p_brand,
    p_type,
    p_size,
    COUNT(DISTINCT ps_suppkey) AS supplier_cnt
FROM
    partsupp,
    part
WHERE
    p_partkey = ps_partkey
    AND p_brand <> 'Brand#45'
    AND p_type NOT LIKE 'MEDIUM POLISHED%'
    AND p_size IN (49, 14, 23, 45, 19, 3, 36, 9)
    AND ps_suppkey NOT IN (
        SELECT
            s_suppkey
        FROM
            supplier
        WHERE
            s_comment LIKE '%Customer%Complaints%'
    )
GROUP BY
    p_brand,
    p_type,
    p_size
ORDER BY
    supplier_cnt DESC,
    p_brand,
    p_type,
    p_size

Cenário

Tempo (s)

Consulta direta no nó de column store somente leitura

0,55

CREATE TABLE ... SELECT no nó primário, ETL from IMCI desativado

>60

CREATE TABLE ... SELECT no nó primário, ETL from IMCI ativado

0,92

INSERT ... SELECT no nó primário, ETL from IMCI desativado

>60

INSERT ... SELECT no nó primário, ETL from IMCI ativado

0,82

À medida que o conjunto de resultados cresce (de 1 linha para 27.840 linhas), aumenta também a sobrecarga de transferência dos resultados do nó de column store para o nó primário. Para consultas que retornam conjuntos de resultados muito grandes, avalie se a melhoria de desempenho justifica o custo dessa transferência.