Tous les produits
Search
Centre de documentation

PolarDB:Utiliser IMCI pour accélérer les traitements ETL

Dernière mise à jour :Aug 11, 2026

L'ETL via IMCI délègue la phase SELECT des instructions CREATE TABLE ... SELECT et INSERT ... SELECT aux nœuds de stockage en colonnes en lecture seule. Le nœud primaire reçoit les résultats par le réseau interne et les écrit dans la table de destination. Vous bénéficiez ainsi de l'accélération In-memory Column Index (IMCI) sans modifier vos requêtes ETL.

Fonctionnement

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

Cas d'utilisation

Privilégiez l'ETL via IMCI lorsque des conditions de requête complexes entraînent une exécution SQL longue, mais ne retournent qu'un faible volume de données :

  • Pré-agrégation de rapports BI : synthétisez de grandes tables de faits en agrégats journaliers ou mensuels à l'aide de INSERT INTO ... SELECT. Les rapports en aval interrogent directement cette table de résultats réduite, ce qui évite des analyses complètes répétées sur les données source.

  • Matérialisation de tables intermédiaires : précalculez et stockez les résultats de jointures ou d'agrégations complexes afin que les requêtes suivantes s'exécutent sur une table compacte plutôt que d'analyser systématiquement des gigaoctets de données brutes.

Évitez l'ETL via IMCI dans les situations suivantes :

  • Requêtes simples : la lecture de données depuis des nœuds de stockage en colonnes distants engendre une surcharge liée à la transmission réseau et à l'analyse du jeu de résultats, susceptible de dégrader les performances.

  • Jeux de résultats volumineux : si une requête retourne une grande quantité de données, leur transfert depuis les nœuds de stockage en colonnes vers le nœud primaire, puis leur écriture dans la table cible, risque de ralentir significativement le système.

Prérequis

Avant de commencer, assurez-vous que votre cluster PolarDB utilise l'une des versions suivantes :

  • PolarDB for MySQL 8.0.1 avec une version de révision 8.0.1.1.29 ou ultérieure

  • PolarDB for MySQL 8.0.2 avec une version de révision 8.0.2.2.12 ou ultérieure

Pour vérifier votre version, consultez la section « Query the engine version » de la rubrique Versions du moteur.

Limites

L'ETL via IMCI s'applique uniquement aux instructions SQL suivantes :

  • CREATE TABLE table_name [AS] SELECT ...

  • INSERT ... SELECT ...

Activer l'ETL via IMCI

Deux paramètres contrôlent cette fonctionnalité :

Paramètre Description Valeurs valides Valeur par défaut
etl_from_imci Indique si les données doivent être lues depuis les nœuds de stockage en colonnes en lecture seule ON, OFF, FORCED OFF
etl_from_imci_compress Détermine si les fichiers sont compressés lors de la lecture depuis les nœuds de stockage en colonnes en lecture seule ON, OFF OFF

**Valeurs de etl_from_imci :**

  • ON : route les instructions SELECT vers les nœuds de stockage en colonnes en lecture seule.

  • OFF (par défaut) : exécute les instructions SELECT sur le nœud primaire.

  • FORCED : force le routage des instructions SELECT vers les nœuds de stockage en colonnes en lecture seule, même si l'instruction se trouve dans une transaction active.

Définissez ce paramètre à trois niveaux différents. Plus le niveau est élevé, plus la portée est large ; les hints au niveau de l'instruction remplacent les paramètres de session et globaux pour une requête donnée.

Niveau global — s'applique à toutes les instructions CREATE TABLE ... SELECT et INSERT ... SELECT du cluster :

SET GLOBAL etl_from_imci = ON;

Niveau session — concerne uniquement les instructions de la session en cours :

SET etl_from_imci = ON;

Niveau instruction — cible une seule instruction au moyen d'un hint d'optimiseur :

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

Vérifier l'activation de la fonctionnalité

Contrôler le routage avec EXPLAIN

Avant de lancer un traitement ETL long, confirmez que la phase SELECT sera bien routée vers le stockage en colonnes. Exécutez EXPLAIN sur la partie SELECT de votre instruction et recherchez dans la sortie les indicateurs d'exécution sur le stockage en colonnes.

Surveiller avec SHOW processlist

Pendant l'exécution d'une instruction ETL, lancez SHOW processlist sur le nœud primaire. Si le routage est actif, la colonne d'état affiche ETL FROM IMCI.

ETL FROM IMCI

Exemple de bout en bout

L'exemple suivant matérialise un résumé quotidien des frais à partir d'une table de transactions brute. L'agrégation SELECT s'exécute sur le nœud de stockage en colonnes en lecture seule, tandis que le nœud primaire écrit le résultat dans la table de synthèse.

Créez les tables source et de destination :

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)
);

Activez l'ETL via IMCI pour la session et insérez les données agrégées :

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;

Interrogez la table de synthèse compacte pour obtenir les totaux mensuels :

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

L'agrégation de l'instruction INSERT INTO ... SELECT s'exécute sur le nœud de stockage en colonnes et se termine en moins d'une seconde pour des jeux de données de 10 Go (voir Comparaison des performances). Les consolidations mensuelles ultérieures portent sur la petite table de synthèse plutôt que sur l'historique complet des transactions.

Comparaison des performances

Les résultats ci-dessous utilisent 10 Go de données générées avec TPC Benchmark H (TPC-H) pour comparer les temps de requête (en secondes) d'agrégations complexes.

Requête retournant 1 ligne :

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
Scénario Temps (s)
Requête exécutée directement sur le nœud de stockage en colonnes en lecture seule 0,05
CREATE TABLE ... SELECT sur le nœud primaire, ETL via IMCI désactivé >60
CREATE TABLE ... SELECT sur le nœud primaire, ETL via IMCI activé 0,17
INSERT ... SELECT sur le nœud primaire, ETL via IMCI désactivé >60
INSERT ... SELECT sur le nœud primaire, ETL via IMCI activé 0,08

Requête retournant 4 lignes :

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
Scénario Temps (s)
Requête exécutée directement sur le nœud de stockage en colonnes en lecture seule 0,58
CREATE TABLE ... SELECT sur le nœud primaire, ETL via IMCI désactivé >60
CREATE TABLE ... SELECT sur le nœud primaire, ETL via IMCI activé 0,64
INSERT ... SELECT sur le nœud primaire, ETL via IMCI désactivé >60
INSERT ... SELECT sur le nœud primaire, ETL via IMCI activé 0,58

Requête retournant 27 840 lignes :

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
Scénario Temps (s)
Requête exécutée directement sur le nœud de stockage en colonnes en lecture seule 0,55
CREATE TABLE ... SELECT sur le nœud primaire, ETL via IMCI désactivé >60
CREATE TABLE ... SELECT sur le nœud primaire, ETL via IMCI activé 0,92
INSERT ... SELECT sur le nœud primaire, ETL via IMCI désactivé >60
INSERT ... SELECT sur le nœud primaire, ETL via IMCI activé 0,82

À mesure que le jeu de résultats s'étoffe (de 1 à 27 840 lignes), la surcharge liée au transfert des résultats du nœud de stockage en colonnes vers le nœud primaire augmente. Pour les requêtes qui retournent des jeux de résultats très volumineux, évaluez si le gain de performance justifie le coût de transfert.