すべてのプロダクト
Search
ドキュメントセンター

PolarDB:IMCI を使用して ETL を高速化する

最終更新日:Jun 12, 2025

PolarDB は、Extract Transform Load(ETL)機能をサポートしています。IMCI からの ETL 機能が有効になると、プライマリノードでインメモリ列インデックス(IMCI)を使用できます。SELECT プライマリノードで実行する文のリクエストは、読み取り専用の列ストアノードに送信されます。その後、IMCI 機能を使用してクエリを高速化できます。データが読み取られると、PolarDB は内部ネットワーク経由でプライマリノードにデータを送信し、宛先テーブルにデータを書き込みます。

仕組み

从只读列存节点读取数据并写入表

前提条件

PolarDB クラスタは、次のいずれかのバージョンを使用しています。

  • リビジョンバージョンが 8.0.1.1.29 以降の PolarDB for MySQL 8.0.1 のクラスタ。

  • リビジョンバージョンが 8.0.2.2.12 以降の PolarDB for MySQL 8.0.2 のクラスタ。

バージョンの確認方法については、エンジンバージョン トピックの「エンジンバージョンのクエリ」セクションをご参照ください。

制限事項

この機能は、次の SQL 文にのみ適用されます。

  • CREATE TABLE table_name [AS] SELECT ...

  • INSERT ... SELECT ...

使用方法

データベースのパラメーターを設定して、読み取り専用の列ストアノードからデータを読み取るか、読み取り専用の列ストアノードからデータを読み取るときにファイルを圧縮するかを指定できます。次の表に、パラメーターを示します。

パラメーター

説明

etl_from_imci

読み取り専用の列ストアノードからデータを読み取るかを指定します。有効な値:

  • ON:読み取り専用の列ストアノードからデータを読み取ります。

  • OFF(デフォルト):読み取り専用の列ストアノードからデータを読み取りません。

  • FORCED:SQL クエリが進行中のトランザクションの一部である場合でも、読み取り専用の列ストアノードからデータを読み取ります。

etl_from_imci_compress

読み取り専用の列ストアノードからデータを読み取るときにファイルを圧縮するかを指定します。有効な値:

  • ON

  • OFF(デフォルト)

パラメーター値を変更する場合、各パラメーターをグローバル、セッション、および文のいずれかのレベルで設定できます。次の例では、etl_from_imci パラメーターを使用しています。

  • グローバルレベルでパラメーターを設定します。

    SET GLOBAL etl_from_imci = ON;

    グローバルレベルでパラメーターを設定すると、現在のクラスタ内のすべての CREATE TABLE new_tbl [AS] SELECT .. リクエストと INSERT ... SELECT ... リクエストは、読み取り専用の列ストアノードからデータを読み取ります。

  • セッションレベルでパラメーターを設定します。

    SET etl_from_imci = ON;

    セッションレベルでパラメーターを設定すると、現在のセッションの CREATE TABLE new_tbl [AS] SELECT .. リクエストと INSERT ... SELECT ... リクエストのみが、読み取り専用の列ストアノードからデータを読み取ります。

  • 文レベルでパラメーターを設定します。

    ヒント を使用して、SQL 文に対して読み取り専用の列ストアノードからデータを読み取るかを指定できます。例:

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

etl_from_imci パラメーターが ON に設定されている場合、データは読み取り専用の列ストアノードから読み取られます。読み取り専用の列ストアノードからデータが読み取られ、プライマリノードに送り返された後、SHOW processlist 文を実行して、プロセスリストの現在のステータス(ETL FROM IMCI であると予想される)を表示できます。ETL FROM IMCI

使用上の注意

複雑なクエリ条件が指定されていて、SQL 文の実行時間が長いにもかかわらず、少量のデータしか返されない場合は、IMCI からの ETL 機能を有効にすることで、パフォーマンスを大幅に向上させることができます。

ただし、IMCI からの ETL 機能は、次のシナリオではパフォーマンスを低下させる可能性があります。

  • 単純なクエリの場合、リモートの読み取り専用の列ストアノードからデータを読み取ると、ネットワーク転送と結果セットの解析に追加のオーバーヘッドが発生します。したがって、パフォーマンスが低下する可能性があります。

  • クエリの結果セットに大量のデータが含まれている場合、リモートの読み取り専用の列ストアノードからデータを読み取り、プライマリノードにデータを送り返し、プライマリノードのテーブルにデータを書き込むと、パフォーマンスが低下する可能性があります。

パフォーマンス比較

次のテストでは、TPC ベンチマーク H(TPC-H)に基づいて生成された 10 GB のデータを使用して、複雑なクエリのパフォーマンスをテストします。

  • クエリ結果には 1 行のデータが含まれています。

    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

    クエリ結果に 1 行のデータが含まれている場合の消費時間値(秒単位)を比較します。

    読み取り専用の列ストアノードでデータをクエリする

    IMCI からの ETL 機能が有効になっていないときに、プライマリノードで CREATE TABLE new_tbl [AS] SELECT ... 文を実行する

    IMCI からの ETL 機能が有効になっているときに、プライマリノードで CREATE TABLE new_tbl [AS] SELECT ... 文を実行する

    IMCI からの ETL 機能が有効になっていないときに、プライマリノードで INSERT ... SELECT ... 文を実行する

    IMCI からの ETL 機能が有効になっているときに、プライマリノードで INSERT ... SELECT ... 文を実行する

    0.05

    > 60

    0.17

    > 60

    0.08

  • クエリ結果には 4 行のデータが含まれています。

    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

    クエリ結果に 4 行のデータが含まれている場合の消費時間値(秒単位)を比較します。

    読み取り専用の列ストアノードでデータをクエリする

    IMCI からの ETL 機能が有効になっていないときに、プライマリノードで CREATE TABLE new_tbl [AS] SELECT ... 文を実行する

    IMCI からの ETL 機能が有効になっているときに、プライマリノードで CREATE TABLE new_tbl [AS] SELECT ... 文を実行する

    IMCI からの ETL 機能が有効になっていないときに、プライマリノードで INSERT ... SELECT ... 文を実行する

    IMCI からの ETL 機能が有効になっているときに、プライマリノードで INSERT ... SELECT ... 文を実行する

    0.58

    > 60

    0.64

    > 60

    0.58

  • クエリ結果には 27,840 行のデータが含まれています。

    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

    クエリ結果に 27,840 行のデータが含まれている場合の消費時間値(秒単位)を比較します。

    読み取り専用の列ストアノードでデータをクエリする

    IMCI からの ETL 機能が有効になっていないときに、プライマリノードで CREATE TABLE new_tbl [AS] SELECT ... 文を実行する

    IMCI からの ETL 機能が有効になっているときに、プライマリノードで CREATE TABLE new_tbl [AS] SELECT ... 文を実行する

    IMCI からの ETL 機能が有効になっていないときに、プライマリノードで INSERT ... SELECT ... 文を実行する

    IMCI からの ETL 機能が有効になっているときに、プライマリノードで INSERT ... SELECT ... 文を実行する

    0.55

    > 60

    0.92

    > 60

    0.82