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

PolarDB:コールドデータ向け並列クエリ

最終更新日:Mar 29, 2026

エラスティック並列クエリ (ePQ) は、OSS テーブルに格納されたコールドデータに対するクエリを高速化します。処理を単一ノード上または複数ノード間で同時に実行される複数のワーカースレッドに分散することで、パフォーマンスを向上させます。

仕組み

ePQ は、独立したスキャンタスクをパラレルワーカーに割り当てます。各ワーカーが OSS テーブル内の CSV データの一部を同時(コンカレント)に読み取り、その後結果を集約します。並列処理の次数は、使用するワーカー数および関与するノード数によって制御されます。

image
コールドデータ向け並列クエリは、CSV 形式のみをサポートします。

対応バージョン

すべてのモードで Enterprise Edition が必要です。

モードデータベースエンジン最低リビジョンバージョン
シングルノード並列クエリ(MySQL 8.0.1)MySQL 8.0.18.0.1.1.34
シングルノード並列クエリ(MySQL 8.0.2)MySQL 8.0.28.0.2.2.24
マルチノード並列クエリMySQL 8.0.28.0.2.2.24

前提条件

開始する前に、以下の条件を満たしていることを確認してください。

image
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 scanExtra 列に表示されない場合、並列クエリは有効化されていません。以下の点を確認してください。

条件修正
loose_csv_max_oss_threads の値が 1(デフォルト)になっている2 以上に設定してください
コールドデータが CSV 形式ではないアーカイブ前にデータを CSV 形式に変換してください
クラスターのバージョンが最低要件を満たしていない対応するリビジョンバージョンへアップグレードしてください(「対応バージョン」をご参照ください)
ePQ が有効化されていないePQ を有効化してください(「エラスティック並列クエリの有効化」をご参照ください)