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 | 読み取り専用の列ストアノードからデータを読み取るかを指定します。有効な値:
|
etl_from_imci_compress | 読み取り専用の列ストアノードからデータを読み取るときにファイルを圧縮するかを指定します。有効な値:
|
パラメーター値を変更する場合、各パラメーターをグローバル、セッション、および文のいずれかのレベルで設定できます。次の例では、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 であると予想される)を表示できます。
使用上の注意
複雑なクエリ条件が指定されていて、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