全部產品
Search
文件中心

PolarDB:使用列索引加速ETL

更新時間:Jun 17, 2025

PolarDB支援ETL(Extract Transform Load)功能,開啟該功能後,您可以在RW節點上使用列存索引,RW節點的SQL語句中的SELECT請求會發送至唯讀列存節點並使用列存索引功能進行加速查詢,讀取資料後,PolarDB會通過內部網路將資料傳回RW節點並寫入目標表。

技術原理

從唯讀列存節點讀取資料並寫入表

前提條件

叢集版本需滿足以下條件之一:

  • PolarDB MySQL版8.0.1版本且Revision version為8.0.1.1.29及以上。

  • PolarDB MySQL版8.0.2版本且Revision version為8.0.2.2.12及以上。

您可以通過查詢版本號碼來確認叢集版本。

使用限制

該功能僅適用於以下兩種SQL語句:

  • CREATE TABLE table_name [AS] SELECT ...

  • INSERT ... SELECT ...

使用方法

您可以在資料庫中通過設定下表中的參數值來選擇是否從唯讀列存節點讀取資料,以及在讀取資料時是否需要壓縮檔。

參數

說明

etl_from_imci

是否從唯讀列存節點讀取資料。取值如下:

  • ON:從唯讀列存節點讀取資料。

  • OFF(預設):不從唯讀列存節點讀取資料。

  • FORCED:取消事務限制。

etl_from_imci_compress

從唯讀列存節點讀取資料時,是否需要壓縮檔。取值如下:

  • ON:從唯讀列存節點讀取資料時,壓縮檔。

  • OFF(預設):從唯讀列存節點讀取資料時,不壓縮檔。

在修改參數值時,您可以將參數值設定為Global層級、Session層級或語句層級,以etl_from_imci參數為例:

  • 設定為Global層級。

    SET GLOBAL etl_from_imci = ON;

    設定為Global層級後,當前叢集的所有CREATE TABLE new_tbl [AS] SELECT ..INSERT ... SELECT ...請求都會從唯讀列存節點讀取資料。

  • 設定為Session層級。

    SET etl_from_imci = ON;

    設定為Session層級後,僅當前Session下的CREATE TABLE new_tbl [AS] SELECT ..INSERT ... SELECT ...請求會從唯讀列存節點讀取資料。

  • 設定為語句層級。

    您可以通過HINT文法為某條SQL語句選擇是否從唯讀列存節點讀取資料。樣本如下:

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

etl_from_imci參數設定為ON,即選擇從唯讀列存節點讀取資料,資料讀取完成並傳回RW節點時,您可以通過SHOW processlist 命令查看processlist狀態,此時,processlist狀態應為ETL FROM IMCI。ETL FROM IMCI

使用說明

當查詢條件複雜,SQL語句執行時間較長但查詢的結果集資料量較小時,開啟ETL功能可以明顯提升效能。

開啟ETL功能並不是在所有情境下都能帶來效能收益,某些情境下效能可能會下降。例如:

  • 當查詢比較簡單時,從遠端唯讀列存節點讀取資料會引入額外的網路傳輸和結果集解析開銷,效能可能會下降。

  • 當查詢的結果集資料量比較大時,從唯讀列存節點讀取資料並傳入RW節點,以及在RW節點上將資料寫入表成為主要瓶頸,使用該功能會導致效能下降。

效能比對

使用TPCH-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行資料時,查詢時間對比如下(單位:秒):

    唯讀列存節點查詢時間

    未開啟ETL功能,在RW節點執行CREATE TABLE new_tbl [AS] SELECT ..語句的時間

    開啟ETL功能後,在RW節點執行CREATE TABLE new_tbl [AS] SELECT ..語句的時間

    未開啟ETL功能,在RW節點執行INSERT ... SELECT ...語句的時間

    開啟ETL功能後,在RW節點執行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行資料時,查詢時間對比如下(單位:秒):

    唯讀列存節點查詢時間

    未開啟ETL功能,在RW節點執行CREATE TABLE new_tbl [AS] SELECT ..語句的時間

    開啟ETL功能後,在RW節點執行CREATE TABLE new_tbl [AS] SELECT ..語句的時間

    未開啟ETL功能,在RW節點執行INSERT ... SELECT ...語句的時間

    開啟ETL功能後,在RW節點執行INSERT ... SELECT ...語句的時間

    0.58

    >60

    0.64

    >60

    0.58

  • 查詢結果為27840行資料。

    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

    查詢結果為27840行資料時,查詢時間對比如下(單位:秒):

    唯讀列存節點查詢時間

    未開啟ETL功能,在RW節點執行CREATE TABLE new_tbl [AS] SELECT ..語句的時間

    開啟ETL功能後,在RW節點執行CREATE TABLE new_tbl [AS] SELECT ..語句的時間

    未開啟ETL功能,在RW節點執行INSERT ... SELECT ...語句的時間

    開啟ETL功能後,在RW節點執行INSERT ... SELECT ...語句的時間

    0.55

    >60

    0.92

    >60

    0.82