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

:コールドデータに対する並列クエリの実行

最終更新日:Aug 20, 2024

このトピックでは、PolarDB for MySQLクラスターでElastic Parallel Query (ePQ) 機能を使用して、コールドデータのクエリパフォーマンスを最適化する方法について説明します。

背景情報

Object Storage Service (OSS) テーブルに保存されるデータ量が増加すると、OSSテーブルのクエリパフォーマンスが低下し、ユーザーエクスペリエンスに大きな影響を与えます。 ePQ機能を使用して問題を解決できます。 ePQ機能は、スレッド数を増やすことでクエリの実行を大幅に高速化します。これにより、クエリプロセスが最適化され、データ取得効率が向上し、必要な情報への迅速なアクセスが保証されます。

説明

CSV形式のコールドデータに対してのみ並列クエリを実行できます。 並列クエリ実行機能は、異なるタスクを独立したワーカーに割り当てます。 ワーカーはOSSテーブルのCSVデータを並行してスキャンするため、クエリ速度が大幅に向上します。 次のテーブルは働くメカニズムを記述します。

image

サポートされているバージョン

クラスターは、次のバージョンとエディションの要件を満たす必要があります。

  • コールドデータに対する単一ノード並列クエリの実行:

    • データベースエンジン: リビジョンバージョンが8.0.1.1.34以降のMySQL 8.0.1

    • エディション: Enterprise Edition /.

  • コールドデータに対する単一ノード並列クエリの実行:

    • データベースエンジン: リビジョンバージョンが8.0.2.2.24以降のMySQL 8.0.2

    • エディション: Enterprise Edition。

  • コールドデータに対するマルチモード並列クエリの実行:

    • データベースエンジン: リビジョンバージョンが8.0.2.2.24以降のMySQL 8.0.2

    • エディション: Enterprise Edition。

前提条件

  • クラスタへの接続が確立される。 詳細については、「クラスターへの接続」をご参照ください。

  • クラスターのコールドデータアーカイブ機能が有効になっています。 詳細については、「コールドデータアーカイブの有効化」をご参照ください。

  • ePQ機能が有効になっています。 詳細については、「elastic parallel queryの有効化」をご参照ください。

  • 並列クエリを実行するコールドデータはCSV形式です。

  • loose_csv_max_oss_threadsパラメーターは、2以上の値に設定されます。

    image

説明

loose_csv_max_oss_threadsパラメーターは、ノード上で並列に実行できるOSSスレッドの最大数を指定します。 loose_csv_max_oss_threadsパラメーターの有効な値は1〜100です。 デフォルト値は 1 です。 デフォルト値を使用すると、コールドデータに対して並列クエリ実行を実行できません。 デフォルトでは、単一のOSSスレッドが128 MBのメモリを消費します。 クラスターの残りのメモリに基づいて、loose_csv_max_oss_threadsパラメーターの値を増やします。

使用量

説明

これらの例では、TPC-Hベンチマークに基づく試験が行われる。 しかしながら、これらの試験は、TPC-Hのベンチマーク試験の全ての要件を満たすわけではない。 したがって、テスト結果は、公開されているTPC-Hベンチマークテスト結果と比較できません。 詳細については、「TPC-Hデータセット」をご参照ください。

コールドデータに対する並列クエリの実行を有効にするには、ePQ機能を有効にし、loose_csv_max_oss_threadsパラメーターを適切に大きな値に設定します。

例: lineitemという名前のテーブルをOSSにアーカイブします。

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)

複数のメソッドを使用して、並列クエリ実行を有効にできます。 たとえば、クエリにヒントを追加して、並列クエリ実行を有効にできます。 並列クエリの実行が有効になっているかどうかを確認するには、EXPLAINステートメントを実行し、[Extra] 列に並列スキャンが表示されているかどうかを確認します。 列に表示されている場合は、並列クエリの実行が有効になります。 ワーカーの数は、並列度を表します。

シリアルクエリ実行

EXPLAIN文を実行し、[Extra] 列に [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)

前の出力は、テーブルの集計計算とスキャンが1つのスレッドで順次実行されることを示します。 並列クエリの実行は無効です。

並列クエリ実行

クエリにヒント (/* + PARALLEL(4) */) を追加して並列クエリの実行を有効にすると、実行プランは、lineitemテーブルで並列クエリの実行が実行されることを示します。 実行計画の [Extra] 列に表示される [Parallel scan] (4ワーカー) 情報は、クエリが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 |        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倍です。

マルチノード並列クエリ

実行計画では、lineitemテーブルのクエリでParallel scanが使用されていることが示されています。 各ノードは4つのワーカーを使用し、合計2つのノードと8つのワーカーが並列実行に使用されます。 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 |        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倍になります。