PolarDB for MySQL では、マテリアライズドビューの完全更新および増分更新の初回実行において、ETL と ePQ の 2 種類の並列書き込みモードがサポートされています。リフレッシュ効率を向上させる最適なモードは、ワイドテーブルとナローテーブル、クラスターシリーズ(Cluster Edition またはマルチプライマリクラスター)、コンピュートオフロードの必要性などのワークロード特性に依存します。
概要
実行効率を向上させるため、PolarDB for MySQL は、マテリアライズドビューの完全更新または増分更新の初回実行に対して、以下の 2 つの並列書き込みモードを提供しています。
モード | アクティベーション | アーキテクチャ | ユースケース |
ETL 並列書き込み(デフォルト) | デフォルトモード(並列処理の次数が 1 より大きい場合に自動的に有効化されます)。 | このモードでは、クエリをリモートノードにオフロードし、複数のワーカーが結果を並列で消費して書き込みます。 | ワイドテーブル、大規模データ量、クエリオフロードが必要なシナリオ。 |
ePQ 並列書き込み | 手動で有効化する必要があります。 | PQ フレームワークが | ナローテーブルおよびエンドツーエンドの並列処理が必要なシナリオ。 |
どちらのモードも、materialized_view_refresh_parallelism を 1 より大きい値に設定する必要があります。
互換性
バージョン | 並列リフレッシュモード | 注記 |
PolarDB for MySQL 8.0.1(マイナーカーネルバージョン 8.0.1.1.54 以降) | ETL モード | ETL モードのみ。 |
PolarDB for MySQL 8.0.2(マイナーカーネルバージョン 8.0.2.2.34 および 8.0.2.2.35) | ePQ モード |
|
リフレッシュプロセス
マテリアライズドビューの完全更新は、次の 3 段階で構成されます。
コンテナテーブルの作成:マテリアライズドビューの定義から新しいコンテナテーブルが作成されます。
materialized_view_implicit_partition_num > 1の場合、並列書き込み時のロック競合を防ぐために、ハッシュパーティションが自動的に追加されます。説明MySQL 8.0.1 は
materialized_view_implicit_partition_numパラメーターをサポートしていません。データの並列書き込み:システムは選択されたモードに従ってデータを並列で書き込みます。
カラムナインデックスの構築(オプション):
materialized_view_add_columnar_index_after_insert = ONの場合、システムはまずリフレッシュを完了した後、コンテナテーブルに対してカラムナインデックス(IMCI)を構築します。
ETL 並列書き込みモード
仕組み
PolarDB はオフロードポリシーに基づいてリモートノード(カラムストアインデックス読み取り専用ノードまたは行ストア読み取り専用ノード)を選択し、接続を確立します。
プライマリ(RW)ノードがマテリアライズドビューの定義クエリをリモートノードに送信して実行します。
リモートノードが結果セットをストリーミングで返します。圧縮データ転送がサポートされています。
プライマリ(RW)ノードが複数のワーカースレッドを作成します。各ワーカースレッドが並列で行をフェッチし、コンテナテーブルの異なるパーティションに書き込みます。
特徴
クエリの計算はリモートノードで実行され、プライマリ(RW)ノードの CPU リソースを消費しません。
書き込み操作はプライマリ(RW)ノード上でローカルに実行され、トランザクションの一貫性が確保されます。
ワイドテーブルのシナリオでは、行長によって並列効率が影響を受けません。
マルチプライマリクラスター(Limitless) をサポートします。
使用方法
PolarDB クラスターパラメーターの変更方法は、コンソールとデータベースセッションで異なります。その違いは以下のとおりです。
互換性:MySQL 設定ファイルとの互換性を考慮し、PolarDB コンソールの一部のクラスターパラメーターには loose_ プレフィックスが付与されています。
手順:
loose_プレフィックス付きのパラメーターを検索・変更します。
データベースセッション(コマンドラインまたはクライアントを使用)の場合
手順:データベースセッションで
SETコマンドを使用してパラメーターを変更する際は、loose_プレフィックスを削除し、元のパラメーター名を使用します。
パラメーター | 例となる値 | セッション単位での変更可否 | 説明 |
| 16 | いいえ | 並列処理の次数を設定します。1 より大きい値を指定すると、並列リフレッシュが有効になります。 |
| FORCE_IMCI | はい | 手動リフレッシュ時に、セッション単位でオフロードポリシーを設定します。 |
パラメーターを設定したら、次のコマンドを実行してマテリアライズドビューをリフレッシュします。
-- マテリアライズドビューをリフレッシュ
REFRESH MATERIALIZED VIEW <schema_name>.<mview_name>;ePQ 並列書き込みモード
仕組み(オフロードポリシーが FORCE_IMCI の場合、リモートカラムストアインデックス読み取り専用ノードへの MPP オフロード)
システムは PQ ワーカーをリモートカラムストアインデックス読み取り専用ノードにスケジューリングし、SELECT スキャンを実行します。
PQ ワーカーがスキャン結果を内部ネットワーク経由でプライマリ(RW)ノードに送信します。圧縮がサポートされています。
複数の PQ ワーカーがプライマリ(RW)ノード上でソーステーブルのデータを並列でスキャンします。
PQ ワーカーがスキャン結果をコンテナテーブルのパーティションに並列で書き込みます。
最後に、プライマリ(RW)ノードがローカルでデータ書き込みを完了します。
特徴
エンドツーエンドの並列処理:単一の並列実行プランでスキャンと書き込みの両方を処理します。
ナローテーブルではほぼ線形のスケーリングを実現します。
ETL のシングルポートネットワーク転送制限を回避します。
現在、Limitless クラスターではサポートされていません。操作は自動的にシリアル実行にフォールバックします。
ネットワーク圧縮(MPP オフロードシナリオ)
前提条件
パラメーター | 例となる値 | セッションレベルで設定可能 | 説明 |
| ZSTD | はい | マテリアライズドビューのリフレッシュ中にレプリカノードから転送されるデータの圧縮アルゴリズムを指定します。圧縮を有効にするには、ZSTD を設定する必要があります。
|
| 3 | はい | 圧縮レベルを指定します。このパラメーターが 0(デフォルト)または無効な値に設定されている場合、システムは ZSTD アルゴリズムでレベル 3 を使用します。
|
影響
ノード間で転送されるデータ量を 60%~80% 削減します。
圧縮および展開により CPU オーバーヘッドが発生します。CPU がボトルネックとなるシナリオでは、このトレードオフを考慮する必要があります。
推奨事項
圧縮転送はワイドテーブルの場合にのみ推奨されます。ナローテーブルでは、圧縮による CPU オーバーヘッドがネットワーク上のメリットを相殺する可能性があるため、UNCOMPRESSED 設定を使用することを推奨します。マテリアライズドビューがワイドテーブルであり、かつ実行オフロードが必要な場合は、MPP オフロード付きの ePQ モードではなく、直接 ETL モードを使用することを検討してください。ETL モードはワイドテーブルに本来適しています。
手順
シナリオ A:リモートノードへの MPP オフロード
パラメーター | 例となる値 | セッションレベルで設定可能 | 説明 |
| 16 | いいえ | 並列処理の次数を設定します。1 より大きい値を指定すると、並列リフレッシュが有効になります。 |
| 16 | はい | 暗黙的パーティションの数を設定します。 説明
|
| FORCE_IMCI | はい | 手動リフレッシュ時に、セッションごとに異なるオフロードポリシーを指定できます。 |
| ON | いいえ | カラムストアインデックス読み取り専用ノードへのオフロードスケジューリングを許可します。 |
| ZSTD | はい | 圧縮転送を有効にします(ワイドテーブルに推奨。ナローテーブルでは省略可能)。 |
| 3 | はい | 圧縮転送の圧縮レベルを設定します。 |
これらのパラメーターを設定したら、リフレッシュを実行します。
-- リフレッシュを実行
REFRESH MATERIALIZED VIEW <schema_name>.<mview_name>;シナリオ B:特定のノードへの ePQ オフロード
クラスターに複数のカラムストアインデックス読み取り専用ノードがある場合、pq_mpp_allow_dispatch_to_imci_node を使用して、ePQ MPP スケジューリングリクエストを受け取るノードを制御できます。このパラメーターは、プライマリ(RW)ノードと対象のカラムストアインデックス読み取り専用ノードの両方で ON に設定する必要があります。このパラメーターがノード上で有効になっていない場合、そのカラムストアインデックス読み取り専用ノードはスケジューリング対象になりません。
-- 1. プライマリ(RW)ノードで、PQ ワーカーリソースとして機能する能力を無効化します。
-- コンソールで pq_mpp_allow_imci_node = OFF を設定します。
-- 2. プライマリ(RW)ノードで、IMCI ノードへのスケジューリングを許可します。
-- コンソールで pq_mpp_allow_dispatch_to_imci_node = ON を設定します。
-- 3. オフロードクエリを処理する IMCI ノードに接続し、そのノードでのみスケジューリングエントリポイントを有効化します。
-- コンソールで pq_mpp_allow_dispatch_to_imci_node = ON を設定します。
-- 4. プライマリ(RW)ノードに戻り、IMCI オフロードポリシーでリフレッシュを実行します。
SET SESSION materialized_view_complete_refresh_offload_policy = FORCE_IMCI;
REFRESH MATERIALIZED VIEW <schema_name>.<mview_name>;この機能を有効化した後、information_schema.cluster_group_resource_view を使用して対象ノードのステータスを確認します。対象のカラムストアインデックス読み取り専用ノードには allow_to_dispatch が表示され、EXTRA 列に Allow to dispatch to IMCI node が含まれている必要があります。このモードでは、カラムストアインデックス読み取り専用ノードはスケジューリングリクエストのみを受け取り、PQ ワーカーとしては機能しません。すべてのカラムストアインデックス読み取り専用ノードを ePQ ワーカーリソースとして機能させるには、pq_mpp_allow_imci_node = ON を設定します。
オフロード対象ノードの選択
オフロードポリシーが MASTER でない場合、システムは SELECT クエリを実行するリモートノードを選択します。
ポリシーによるノードタイプの決定
| 候補ノードタイプ | 説明 |
| IMCI 読み取り専用ノード | マスター(RW)ノードでのローカル実行にフォールバックし、警告をログに記録します。 |
| IMCI 読み取り専用ノード | エラーで失敗します。 |
| 行ストア読み取り専用ノード | マスター(RW)ノードでのローカル実行にフォールバックし、警告をログに記録します。 |
| 行ストア読み取り専用ノード | エラーで失敗します。 |
| IMCI 読み取り専用ノードまたは行ストア読み取り専用ノード(コストに基づく) | 利用可能なノードタイプが 1 種類のみの場合、そのタイプを選択します。どちらも利用できない場合は、マスター(RW)ノードにフォールバックします。 |
COST ポリシーの決定ロジック
materialized_view_complete_refresh_offload_policy = COST の場合、システムはクエリのオプティマイザーのコストとしきい値を比較して対象ノードを決定します。
クエリコスト ≥
cost_threshold_for_imciの場合:IMCI 読み取り専用ノードにオフロードします。IMCI は高コストのスキャンおよび集約クエリに適しています。クエリコスト <
cost_threshold_for_imciの場合:行ストア読み取り専用ノードにオフロードします。行ストア読み取り専用ノードは軽量なクエリに十分です。
-- コストのしきい値を設定(デフォルトは 0 で、すべてのクエリが IMCI にオフロードされる傾向があります)。
SET SESSION cost_threshold_for_imci = 100000;
-- COST ポリシーを使用。
SET SESSION materialized_view_complete_refresh_offload_policy = COST;複数ノードの負荷分散
同じタイプのノードが複数ある場合、システムはラウンドロビン方式でノードを選択します。
各リフレッシュタスクは、グローバルカウンターに基づいて次のノードを選択します。
選択されたノードへの接続が失敗した場合、システムはリスト内の次のノードを自動的に試行し、すべてのノードを試行するまで繰り返します。
システムは、異なるマテリアライズドビューのリフレッシュタスクをノード間で均等に分散します。
ePQ + MPP タスクを IMCI ノードにオフロードするには、次の 2 つの方法のいずれかを使用します。
pq_mpp_allow_imci_nodeを有効にして、すべての IMCI 読み取り専用ノードへのオフロードをサポートします。まず
pq_mpp_allow_imci_node = OFFを設定し、次にpq_mpp_allow_dispatch_to_imci_nodeを使用して候補となる IMCI 読み取り専用ノードを絞り込みます。マスター(RW)ノードで
pq_mpp_allow_dispatch_to_imci_node = ONを設定し、マスター(RW)ノードがリモート IMCI 読み取り専用ノードからのディスパッチエントリポイントステータスを受け入れることを許可します。オフロードクエリを処理させたい各 IMCI 読み取り専用ノードで
pq_mpp_allow_dispatch_to_imci_node = ONを設定します。オフロードクエリを処理させたくない各 IMCI 読み取り専用ノードでは、
pq_mpp_allow_dispatch_to_imci_node = OFFのままにしておきます。
推奨ポリシー
本番環境では、FORCE_IMCI または FORCE_TPRO を使用してください。PREFER_* ポリシーは避けてください。
理由:PREFER_* ポリシーでは、対象ノードが利用できない場合、マスター(RW)ノードでのローカル実行に静かにフォールバックします。このフォールバックにより、INSERT SELECT 文がマスター(RW)ノードでフルスキャンおよび書き込みを実行します。これにより大規模トランザクションが発生し、マスター(RW)ノード上のオンラインワークロードのパフォーマンスに影響を与える可能性があります。
構成例
-- 推奨:IMCI ノードの使用を強制します。利用できない場合はフォールバックせずに失敗します。
SET SESSION materialized_view_complete_refresh_offload_policy = FORCE_IMCI;
-- 行ストア読み取り専用ノードのみを使用します。利用できない場合は失敗します。
SET SESSION materialized_view_complete_refresh_offload_policy = FORCE_TPRO;
-- クエリコストに基づいて IMCI と TPRO の間を自動選択します。
SET SESSION materialized_view_complete_refresh_offload_policy = COST;
SET SESSION cost_threshold_for_imci = 50000;パラメーターのスコープと設定
基本ルール
GLOBALパラメーター:コンソールでのみ設定でき、すべてのセッションおよび自動リフレッシュスレッドに適用されます。SESSIONパラメーター:SET SESSIONを使用して現在のセッションに設定できます。また、コンソールでデフォルト値を変更することも可能です。自動リフレッシュスレッドはGLOBALデフォルト値を使用します。
ETL 並列書き込みモードのパラメータースコープ
パラメーター | スコープ | セッション単位での変更可否 | 説明 |
| GLOBAL | いいえ、GLOBAL である必要があります | すべてのリフレッシュタスクで同じ並列処理の次数を共有します。 |
| SESSION | はい | 手動リフレッシュの場合、セッションごとに異なるオフロードポリシーを指定できます。 |
| SESSION | はい | アトミックオートインクリメント最適化を無効化できます。 |
| SESSION | はい | 結果セットのキャッシュを有効にします。 |
ePQ 並列書き込みモードのパラメータースコープ
パラメーター | スコープ | セッション単位での変更可否 | 説明 |
| GLOBAL | いいえ、GLOBAL である必要があります | すべてのリフレッシュタスクで同じ並列処理の次数を共有します。 |
| GLOBAL | いいえ、GLOBAL である必要があります | MPP タスクを IMCI ノードにスケジューリングできるかどうかを制御します。 |
| GLOBAL | いいえ、GLOBAL である必要があります | IMCI スケジューリングエントリポイントの使用を許可します。このパラメーターは、プライマリ(RW)ノードとカラムナインデックスを含む対象の読み取り専用ノードの両方で有効化する必要があります。 |
| SESSION | はい | 手動リフレッシュの場合、セッションごとに異なるオフロードポリシーを指定できます。 |
| SESSION | はい | 各マテリアライズドビューで異なるパーティション数を使用できます。 |
| SESSION | はい | MPP オフロード時のトランスポート圧縮アルゴリズムを指定します。この設定は PQ ワーカーに自動的に伝播されます。 |
| SESSION | はい | 圧縮レベルを指定します。この設定は PQ ワーカーに自動的に伝播されます。 |
注記
手動リフレッシュのみを使用する場合、各セッションで
SESSIONパラメーターを調整できます。自動リフレッシュに依存する場合、コンソールですべての
SESSIONパラメーターの適切なデフォルト値を設定する必要があります。GLOBALパラメーターは、リフレッシュ方法に関係なくコンソールで設定する必要があります。変更は、その後のすべてのタスクに対して即座に有効になります。SET SESSION設定はクラスターリスタート後に永続化されません。一方、コンソールで変更されたGLOBALパラメーターは永続化されます。
パラメーターリファレンス
コアパラメーター
パラメーター | スコープ | 値 | デフォルト | 説明 |
| GLOBAL | 1~1024 | 1 | パラレルワーカーの数。1 より大きい値を指定すると、並列リフレッシュが有効になります。 |
| SESSION | 0 ~ 無制限 | 1 | コンテナテーブルの暗黙の HASH パーティションの数です。1 より大きい値を指定すると、暗黙の HASH パーティション分割が有効になります。 説明 MySQL 8.0.1 は、 |
| SESSION | ON/OFF | ON | 暗黙的パーティション列に対してアトミックオートインクリメント値を使用することでパフォーマンスを向上させます。 |
コンピュートオフロードパラメーター
パラメーター | スコープ | 値 | デフォルト | 説明 |
| SESSION |
| クエリ計算のオフロードポリシーを指定します。 | |
| GLOBAL | ON/OFF | OFF | 読み取り専用 IMCI ノードに PQ ワーカーをスケジューリングすることを許可します(ePQ モードに必須)。 |
| GLOBAL | ON/OFF | OFF | IMCI ディスパッチエントリポイントの使用を許可します。このパラメーターは、プライマリ(RW)ノードと対象の読み取り専用 IMCI ノードの両方で有効化する必要があります。 |
ネットワーク圧縮パラメーター
パラメーター | スコープ | 値 | デフォルト | 説明 |
| SESSION |
| UNCOMPRESSED | 内部 PQ チャンネルの圧縮アルゴリズムを指定します。この設定は ePQ MPP オフロードモードでのみ適用されます。 |
| SESSION | 0~22 | 0 | PQ チャンネルの ZSTD 圧縮レベルを指定します。0 に設定すると、ZSTD のデフォルトレベル(3)が使用されます。 |
| SESSION | ON/OFF | OFF | 結果セット全体をメモリにキャッシュするかどうかを指定します。この設定は ETL モードでのみ有効です。 |
圧縮の仕組み:
モード | 圧縮場所 | 有効条件 |
ePQ(MPP オフロード) | プライマリ(RW)ノードとリモートノード間の内部 PQ チャンネル。 |
|
ePQ(ローカルのみ) | ネットワーク転送なし。 | 該当なし。 |
materialized_view_etl_compression_level パラメーターは、materialized_view_etl_compression_algorithm = ZSTD の場合にのみ有効です。0 に設定すると、ZSTD のデフォルトレベル 3 が使用されます。1~22 の値を設定すると、指定されたレベルが使用されます。レベルを高くすると圧縮率は向上しますが、CPU オーバーヘッドも増加します。
オフロードポリシー(materialized_view_complete_refresh_offload_policy パラメーター)
値 | 説明 |
| プライマリ(RW)ノードがすべての操作をローカルで実行します。 |
| 読み取り専用 TPRO ノードへのオフロードを優先します。利用できない場合はプライマリ(RW)ノードにフォールバックします。 |
| 読み取り専用 IMCI ノードへのオフロードを優先します。利用できない場合はプライマリ(RW)ノードにフォールバックします。 |
| 読み取り専用 TPRO ノードへの計算オフロードを強制します。そのようなノードが利用できない場合、操作は失敗します。 |
| 読み取り専用 IMCI ノードへの計算オフロードを強制します。そのようなノードが利用できない場合、操作は失敗します。 |
| コストベースモデルを使用して、読み取り専用 IMCI ノードまたは読み取り専用 TPRO ノードのいずれかを自動的に選択してオフロードします。 |
モード選択の推奨事項
シナリオ | 推奨モード | 主な構成 |
リモートノードのないナローテーブル | ローカル限定 ePQ |
|
カラムストアインデックス付き読み取り専用ノードまたは行ストア読み取り専用ノードのあるナローテーブル | MPP オフロード付き ETL/ePQ |
|
ワイドテーブルまたは大規模フィールドを含むテーブル | ETL |
|
ETL | ETL モードを使用します。マルチマスタクラスターでは ePQ は利用できません。 |
注意事項
並列処理の次数が 1 の場合の効果なし:両方の並列モードは、シリアルの INSERT SELECT 操作に劣化します。
リモートノードの可用性:ETL モードおよび ePQ MPP オフロードはどちらもリモートノードに依存します。リモートノードが利用できない場合、
FORCE_*ポリシーはエラーを返し、PREFER_*ポリシーはプライマリ(RW)ノードでのローカル実行にフォールバックします。マルチプライマリ環境の制限:マルチプライマリクラスター(Limitless) では、ePQ モードは自動的に無効化され、シリアル実行にフォールバックします。並列リフレッシュには ETL モードを使用してください。
IMCI カラムカバー率:カラムナインデックスを持つ読み取り専用ノードに ePQ MPP オフロードを使用する場合、カラムナインデックスはマテリアライズドビュークエリで読み取られるすべての列をカバーしている必要があります。そうでない場合、システムはエラーを返します。ETL モードにはこの制限はありません。
暗黙的パーティション数:この値を並列処理の次数の 0.5~2 倍に設定することを推奨します。パーティションが少なすぎると書き込み競合が発生し、多すぎるとファイル管理のオーバーヘッドが増加します。
書き込み場所:どちらのモードでも、データ書き込みは常にプライマリ(RW)ノード上でローカルに完了します。オフロードは SELECT クエリの実行場所にのみ影響します。
パラメーターの永続化:
SET SESSIONで設定された内容はクラスターリスタート後に永続化されませんが、コンソールで変更された GLOBAL パラメーターは永続化されます。圧縮と CPU のトレードオフ:ePQ MPP オフロードでは、
materialized_view_etl_compression_algorithm=ZSTDを設定することを推奨します。ただし、ナローテーブルでは圧縮による CPU オーバーヘッドがネットワーク上のメリットを相殺する可能性があります。