エラスティック並列クエリ (ePQ) は、OSS テーブルに格納されたコールドデータに対するクエリを高速化します。処理を単一ノード上または複数ノード間で同時に実行される複数のワーカースレッドに分散することで、パフォーマンスを向上させます。
仕組み
ePQ は、独立したスキャンタスクをパラレルワーカーに割り当てます。各ワーカーが OSS テーブル内の CSV データの一部を同時(コンカレント)に読み取り、その後結果を集約します。並列処理の次数は、使用するワーカー数および関与するノード数によって制御されます。

コールドデータ向け並列クエリは、CSV 形式のみをサポートします。
対応バージョン
すべてのモードで Enterprise Edition が必要です。
| モード | データベースエンジン | 最低リビジョンバージョン |
|---|---|---|
| シングルノード並列クエリ(MySQL 8.0.1) | MySQL 8.0.1 | 8.0.1.1.34 |
| シングルノード並列クエリ(MySQL 8.0.2) | MySQL 8.0.2 | 8.0.2.2.24 |
| マルチノード並列クエリ | MySQL 8.0.2 | 8.0.2.2.24 |
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
クラスターに接続済みであること。詳細については、「クラスターへの接続」をご参照ください。
クラスター上でコールドデータアーカイブが有効化されていること。詳細については、「コールドデータアーカイブの有効化」をご参照ください。
ePQ 機能が有効化されていること。詳細については、「エラスティック並列クエリの有効化」をご参照ください。
CSV 形式のコールドデータが存在すること
loose_csv_max_oss_threadsの値が 2 以上に設定されていること

loose_csv_max_oss_threads は、単一ノード上で並列実行される OSS スレッドの最大数を制御します。有効な値の範囲は 1~100 です。デフォルト値は 1 です。デフォルト値のままでは並列クエリは無効化されます。各 OSS スレッドは 128 MB のメモリを消費するため、このパラメーターはクラスターの利用可能なメモリ量に基づいて適切に設定してください。コールドデータでの並列クエリ実行
以下の例では TPC-H データセットを使用していますが、正式な TPC-H ベンチマークテストのすべての要件を満たすものではありません。そのため、得られた結果は公開されている TPC-H ベンチマーク結果と比較できません。詳細については、「TPC-H データセット」をご参照ください。
これらの例では、CSV 形式で OSS にアーカイブされた lineitem という名前のテーブルを使用します。
mysql> show create table lineitem;
*************************** 1. row ***************************
Table: lineitem
Create Table: CREATE TABLE `lineitem` (
`l_orderkey` int(11) NOT NULL,
`l_partkey` int(11) NOT NULL,
`l_suppkey` int(11) NOT NULL,
`l_linenumber` int(11) NOT NULL,
`l_quantity` decimal(10,2) NOT NULL,
`l_extendedprice` decimal(10,2) NOT NULL,
`l_discount` decimal(10,2) NOT NULL,
`l_tax` decimal(10,2) NOT NULL,
`l_returnflag` char(1) NOT NULL,
`l_linestatus` char(1) NOT NULL,
`l_shipDATE` date NOT NULL,
`l_commitDATE` date NOT NULL,
`l_receiptDATE` date NOT NULL,
`l_shipinstruct` char(25) NOT NULL,
`l_shipmode` char(10) NOT NULL,
`l_comment` varchar(44) NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 /*!99990 800020204 NULL_MARKER='NULL' */ CONNECTION='default_oss_server'
1 row in set (0.00 sec)並列クエリを有効化するには、クエリに /*+ PARALLEL(N) */ ヒントを追加します。ここで N はノードあたりのワーカー数です。並列クエリが有効化されているかを確認するには、EXPLAIN を実行し、Extra 列を確認してください。
Extra 列の値 | 意味 |
|---|---|
Parallel scan (N workers) | 並列クエリが有効化されています。N は関与するすべてのノードにおけるワーカースレッドの合計数です |
MPP (N nodes) | マルチノード並列クエリが有効化されています。N は関与するノード数です |
全体の並列処理の次数 = ノードあたりのワーカー数 × ノード数
直列クエリ
ヒントを指定しない場合、クエリは単一スレッドで実行されます。Extra 列には Using where が表示され、Parallel scan は表示されません。
mysql> explain 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 0.05 - 0.01 AND 0.05 + 0.01
-> AND l_quantity < 24;
+----+-------------+----------+------------+------+---------------+------+---------+------+----------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+----------+----------+-------------+
| 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 61560489 | 0.41 | Using where |
+----+-------------+----------+------------+------+---------------+------+---------+------+----------+----------+-------------+
1 row in set, 1 warning (1.23 sec)テーブルは単一スレッドで順次スキャンおよび集約されます。
シングルノード並列クエリ
現在のノード上で 4 つのワーカーにスキャン処理を分散させるために、/*+ PARALLEL(4) */ を追加します。Parallel scan (4 workers) が Extra 列に表示されれば、並列クエリが有効化されていることが確認できます。
mysql> explain SELECT /*+ PARALLEL(4) */
-> 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 0.05 - 0.01 AND 0.05 + 0.01
-> AND l_quantity < 24;
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------+
| 1 | SIMPLE | <gather1.1> | NULL | ALL | NULL | NULL | NULL | NULL | 4 | 100.00 | NULL |
| 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 15390122 | 0.41 | Parallel scan (4 workers); Using where |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------+
2 rows in set, 1 warning (2.17 sec)現在のノード上で 4 つのワーカーが並列実行され、単一スレッドクエリと比較して約 4 倍のスループットが得られます。
マルチノード並列クエリ
複数ノードが関与する場合、Extra 列には Parallel scan (N workers) および MPP (N nodes) の両方が表示されます。ここでは、Parallel scan (8 workers) は全ノードで合計 8 個のワーカーが動作中であることを示し、MPP (2 nodes) は 2 ノードが関与していることを示します(つまり、ノードあたり 4 個のワーカー)。
mysql> explain SELECT /*+ PARALLEL(4) */
-> 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 0.05 - 0.01 AND 0.05 + 0.01
-> AND l_quantity < 24;
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------------------+
| 1 | SIMPLE | <gather1.1> | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | NULL |
| 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 59986051 | 0.41 | Parallel scan (8 workers); MPP (2 nodes); Using where |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)2 ノードおよび合計 8 個のワーカーを用いることで、単一スレッドクエリと比較して約 8 倍のスループットが得られます。
トラブルシューティング
EXPLAIN の実行結果において、Parallel scan が Extra 列に表示されない場合、並列クエリは有効化されていません。以下の点を確認してください。
| 条件 | 修正 |
|---|---|
loose_csv_max_oss_threads の値が 1(デフォルト)になっている | 2 以上に設定してください |
| コールドデータが CSV 形式ではない | アーカイブ前にデータを CSV 形式に変換してください |
| クラスターのバージョンが最低要件を満たしていない | 対応するリビジョンバージョンへアップグレードしてください(「対応バージョン」をご参照ください) |
| ePQ が有効化されていない | ePQ を有効化してください(「エラスティック並列クエリの有効化」をご参照ください) |