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

PolarDB:列指向テーブル向けの超並列処理

最終更新日:May 08, 2026

このトピックでは、PolarDB for MySQL の列指向テーブルが提供する超並列処理(MPP)機能について、アーキテクチャ、ユースケース、ベストプラクティス、およびパフォーマンスベンチマークを含めて説明します。

説明

列指向テーブルのマルチノード並列実行に関するご質問がある場合は、PolarDB テクニカルサポートまでお問い合わせください。

背景情報

列指向テーブルは、PolarDB 向けの OLAP ソリューションを提供します。クエリ対象のデータ量やクエリの複雑さが増加し、OSS などの外部テーブルへのクエリ需要も高まるにつれて、シングルの読み取り専用ノードでは大規模データ処理のパフォーマンス要件を満たせなくなる可能性があります。これを解決するために、列指向テーブルクラスターでは MPP 機能とリソースのエラスティックスケーリング機能を提供しています。

アーキテクチャ

MPP は複数の読み取り専用ノードを 1 つの実行グループにまとめ、クエリを並列で処理します。ワークロードの変化に応じて、読み取り専用ノードを追加または削除することで、クエリパフォーマンスとコンピューティングコストのバランスを調整できます。

前提条件

ご利用の PolarDB for MySQL クラスターは、以下の条件を満たしている必要があります。

  • エディションEnterprise Edition

  • エンジンバージョンMySQL 8.0.2。マイナーバージョンは 8.0.2.2.34 以降である必要があります。

ユースケース

  • マルチノードのエラスティックリソースにより CPU および IOPS をスケールアウトし、クエリレイテンシーを低減します。

  • 各ノードがデータの一部のみを処理することで、データキャッシング効率を向上させます。

ベストプラクティス

大規模データを分析する際の主な目標は、データ転送(シャッフル)を最小限に抑え、ディスク読み取り(I/O)を削減することです。PolarDB の列指向テーブルでは、パーティションキーおよびソートキーを使用して、最適なクエリパフォーマンスを実現できます。

パーティションキー

パーティションキーは、データを複数のノードに分散配置します。基本原則は、関連するデータを同じノード上に保持し、ローカルでの計算を可能にすることです。

仕組み

第 1 レベルまたは第 2 レベルで HASH または KEY パーティショニングを使用するパーティションテーブルの場合、マルチノード実行は共有なし(share-nothing)アプローチを採用します。各パーティションは単一のノードによって処理されます。

主なメリット

  • データキャッシングの改善:各ノードは割り当てられたパーティションのみを処理するため、ローカルメモリキャッシュをより効率的に活用できます。

  • クエリパフォーマンスの最適化:JOIN および GROUP BY 操作をパーティションキーに基づいて実行すると、各ノード上でローカルにデータを処理できるため、ノード間のデータ転送が大幅に削減されます。

ベストプラクティス

  • コアとなるビジネスキーを使用:最も頻繁に JOIN 句または GROUP BY 句で使用されるカラム(例:order_iduser_id)をパーティションキーとして選択します。

  • パーティション数を一致させる:JOIN 操作に関与するテーブルは、HASH/KEY パーティションの数が完全に一致している必要があります。パーティション数が異なると、ローカル計算が不可能になります。

  • パーティション数には大きな素数を使用:97 や 199 などの大きな素数をパーティション数として使用してください。これにより、ノード間でデータが均等に分散され、データスキューを防ぐことができます。

ソートキー

ソートキーは、各物理パーティション内のデータを整理します。基本原則は、読み取り時に不要なデータをスキップすることです。RANGE パーティションを使用するか、列指向テーブルにソートキーを追加することで、大量のデータを効率的にフィルタリングできます。

仕組み

列指向ストレージでは、データはストライプ単位で管理されます。ソートキーを設定すると、各ストライプ内のデータが指定されたカラムで物理的にソートされます。クエリ実行時、エンジンは各ストライプヘッダーに含まれる min/max 値などのメタデータを参照し、そのストライプを読み取るかスキップするかを判断します。

主なメリット

  • 効率的なデータプルーニング:WHERE 句でソートキーに基づくフィルター条件を指定すると、クエリエンジンはフィルター条件に該当しないデータ範囲を持つストライプ全体をスキップします。これにより、ディスク I/O が削減されます。

ベストプラクティス

  • 高頻度フィルター対象カラムを選択:WHERE 句で頻繁に使用されるカラム(特に範囲クエリ(><BETWEEN)や高カーディナリティの等価クエリ)にソートキーを設定します。

  • RANGE パーティションと併用:多段階のデータフィルタリングを実現するため、RANGE パーティションとソートキーを組み合わせて使用します。

パフォーマンスベンチマーク

以下の表は、32 コア 256 GB のノードを 3 台使用した MPP クラスターにおける、TPC-H 1 TB ベンチマークの結果を示しています(列指向テーブル使用)。

説明

本トピックで紹介する TPC-H 実装は TPC-H ベンチマークに基づいていますが、テストが TPC-H 要件をすべて満たしていないため、公開されている TPC-H ベンチマーク結果との比較はできません。

クエリ

時間 (s)

Q1

8.189

Q2

0.567

Q3

1.784

Q4

1.38

Q5

2.268

Q6

2.359

Q7

2.068

Q8

1.593

Q9

10.761

Q10

10.054

Q11

0.795

Q12

7.595

Q13

10.848

Q14

3.023

Q15

2.286

Q16

2.253

Q17

11.651

Q18

25.612

Q19

11.557

Q20

2.739

Q21

4.82

Q22

3.141

TOTAL

127.343

よくある質問

SQL ステートメントが MPP を使用しているかどうかを確認する方法を教えてください。

SQL ステートメントの EXPLAIN 実行計画を分析することで、MPP を使用しているかどうかを判断できます。重要な指標は、Exchange オペレーターの有無です。

  1. ステップ 1:MPP 計画の実行可能性を確認

    まず、オプティマイザーが SQL ステートメントに対して MPP 計画を生成できるかどうかを特定のヒントを使用して検証します。

    方法:SQL ステートメントの先頭に EXPLAIN を追加し、/*+ SET_VAR(imci_plan_use_mpp=forced) */ ヒントを挿入します。これにより、オプティマイザーは強制的に MPP 実行計画を生成します。

    EXPLAIN SELECT /*+ SET_VAR(imci_plan_use_mpp=forced) */ COUNT(*) FROM nation;

    結果:実行計画に Exchange オペレーターが含まれている場合、その SQL ステートメントはマルチノード並列実行を利用可能です。

  2. ステップ 2:実際の実行計画を確認

    実行可能性を確認した後、ヒントなしで元の SQL ステートメントに対してオプティマイザーが実際に MPP モードを選択しているかどうかを確認します。

    方法:元の SQL ステートメントに対して EXPLAIN を実行します。

    EXPLAIN SELECT COUNT(*) FROM nation;

    結果:

    • 実行計画に Exchange オペレーターが含まれている場合、オプティマイザーはそのクエリに対してマルチノード並列実行を有効にしています。

    • 実行計画に Exchange オペレーターが含まれていない場合、以下のいずれかが原因である可能性があります。

      • クエリがシンプルすぎる、または対象データ量が少なすぎるため、オプティマイザーがシングルノード実行の方が高速だと判断しています。

      • SQL 構文やテーブル構造(例:パーティションキーの設定)により、MPP の使用が制限されています。ステップ 1 を参考に、SQL またはテーブル設計を最適化してください。