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

PolarDB:パラレルDDL

最終更新日:Jun 11, 2024

このトピックでは、PolarDB-XのDDL文の並列度 (DOP) を制御する方法について説明します。

前提条件

  • 物理的に実行されるDDLステートメントのDOPを制御する場合、PolarDB-XインスタンスのカーネルバージョンはV5.4.15-16715927またはそれ以降です。

  • 論理的に実行されたDDLステートメントのDOPを制御する場合、PolarDB-XインスタンスのカーネルバージョンはV5.4.16-16825599またはそれ以降です。

使用状況ノート

このトピックで説明するパラメーターを使用してDDLステートメントのリソース使用量を増やすと、ビジネストラフィックが影響を受ける可能性があります。 DOPを調整する前に、ビジネス要件に基づいてDOP調整が必要であり、クラスターリソース仕様が要件を満たしていることを確認してください。

概要

PolarDB-XのDDLステートメントは、物理的または論理的に実行できます。 上記の2つの実行モードの特性と、さまざまな種類のDDLステートメントの実行モードの詳細については、「Online DDL」をご参照ください。 さまざまなモードで実行されるDDLステートメントの場合、PolarDB-Xには、DDLステートメントによって占有されるリソースとデータ処理のスループットを制御するために使用できるさまざまなパラメーターが用意されています。

  • 物理的に実行されるDDL文の場合、計算ノード (CN) は、物理テーブル上で実行される物理DDL文を転送する。 主なリソースのオーバーヘッドは、データノード (DN) にあります。 PolarDB-Xは、物理DDLステートメントを転送するDOPに関連する制御パラメータを提供します。

  • 論理的に実行されたDDLステートメントの場合、CNは、プロセス全体で、データバックフィル、マルチ書き込み、検証、およびメタデータ管理を含むすべてのロジックを処理します。 データのバックフィルは、ほとんどのリソースと時間を占めます。 PolarDB-Xは、論理実行中のデータバックフィルDOPに関連する制御パラメータを提供します。

物理的に実行されるDDLステートメントのDOPコントロール

物理的に実行されるDDL文の場合、次の表に示すパラメーターを使用して、物理DDL文を転送するDOPを制御できます。

パラメーター

タイプ

レベル

の説明

デフォルト値

推奨される最大設定

MERGE_DDL_CONCURRENT

bool

セッションまたはグローバル

物理DDLステートメントを並列に送信するかどうかを指定します。

false

このパラメーターは true に設定することを推奨します。

MERGE_CONCURRENT

bool

セッションまたはグローバル

データベースシャードと並行して接続を確立するかどうかを指定します。

false

このパラメーターは true に設定することを推奨します。

PREFETCH_SHARDS

int

セッションまたはグローバル

物理DDLステートメントをすべての物理データベースに送信する場合の最大DOP。

1 × DNの数

最大値は、DN上のCPUコアの数にDNの数 を掛けた結果に設定することを推奨します。

デフォルトでは、単一の物理DDLステートメントは単一のCPUコアで高い使用率を実現できます。 したがって、PREFETCH_SHARDSパラメーターの値がすべてのDNのCPUコア数を超えている場合、値を増やしても効果は大きくありません。

たとえば、インスタンスに2つのCNと2つのDNがあり、それぞれ16のCPUコアと64 GBのメモリがあり、Transaction Processing Performance CouncilベンチマークC (TPC-C) 10000ウェアハウスのbmsql_order_lineテーブルにローカルインデックスを追加する場合。 インスタンスに十分なリソースがある場合、次の方法でパラメーターを設定できます。

/* + TDDL:cmd_extra(MERGE_DDL_CONCURRENT=true,MERGE_CONCURRENT=true,PREFETCH_SHARDS=32)* /
ALTER TABLE 'bmsql_order_line 'ADD LOCAL INDEX 'i_ol_d_id'('ol_d_id '); 

show physical processlist where info like "% i_ol_d_id %; コマンドを実行して、DNでの物理DDLステートメントの同時実行を表示できます。

論理的に実行されたDDLステートメントのDOP制御

論理的に実行されたDDLステートメントの場合、次の表に示すパラメーターを使用して、データバックフィルとリソース制限のDOPを制御できます。 show ddl statusコマンドを実行して、論理実行の進行状況を表示することもできます。

次の表に、GSIの追加、テーブルの再分割、およびOMCの実行のために実行されるDDLステートメントのDOP制御パラメーターを示します。

パラメーター

タイプ

レベル

の説明

デフォルト値

推奨される最大設定

BACKFILL_PARALLELISM

int

グローバル

グローバルに許可される同時バックフィルスレッドの最大数。

max(CPU_cores, 8) * 4

通常、このパラメーターを調整する必要はありません。

SLIDE_WINDOW_TIME_INTERVAL

int

セッションまたはグローバル

大規模な物理テーブルの同時バックフィルの開始の遅延。 単位は秒です。

60

リソースが十分な場合は、値を0に設定できます。

GSI_BACKFILL_PARALLELISM

int

セッションまたはグローバル

単一のDDLタスクで許可される同時バックフィルスレッドの最大数。

-1

通常、このパラメーターを調整する必要はありません。

PHYSICAL_TABLE_BACKFILL_PARALLELISM

int

セッションまたはグローバル

単一の物理テーブルに許可される同時バックフィルスレッドの最大数。

4

CN上のCPUコアの数に負荷に基づいて2を掛けた結果に最大値を設定することを推奨します。

GSI_BACKFILL_SPEED_LIMITATION

int

セッションまたはグローバル

許可される最大バックフィル率。 単位: row/s。

150000

負荷に基づいて最大値を-1に設定することを推奨します。

次の表に、パーティションとスケールテーブルを移動するために実行されるDDLステートメントのDOP制御パラメーターを示します。

パラメーター

タイプ

レベル

の説明

デフォルト値

推奨される最大設定

BACKFILL_PARALLELISM

int

グローバル

グローバルに許可される同時バックフィルスレッドの最大数。

max(CPU_cores, 8) * 4

通常、このパラメーターを調整する必要はありません。

SLIDE_WINDOW_TIME_INTERVAL

int

セッションまたはグローバル

大規模な物理テーブルの同時バックフィルの開始の遅延。 単位は秒です。

60

リソースが十分な場合は、値を0に設定できます。

SCALEOUT_BACKFILL_PARALLELISM

int

セッションまたはグローバル

単一のDDLタスクで許可される同時バックフィルスレッドの最大数。

-1

通常、このパラメーターを調整する必要はありません。

PHYSICAL_TABLE_BACKFILL_PARALLELISM

int

セッションまたはグローバル

単一の物理テーブルに許可される同時バックフィルスレッドの最大数。

4

CN上のCPUコアの数に負荷に基づいて2を掛けた結果に最大値を設定することを推奨します。

SCALEOUT_BACKFILL_SPEED_LIMITATION

int

セッションまたはグローバル

許可される最大バックフィル率。 単位: row/s。

300000

負荷に基づいて最大値を-1に設定することを推奨します。

たとえば、インスタンスに2つのCNと2つのDNがあり、それぞれに16のCPUコアと64 GBのメモリがあり、TPC-C 10000ウェアハウスのbmsql_order_lineテーブルにグローバルインデックスを追加する場合。 デフォルトのパラメーター設定が使用されている場合、次のステートメントが実行されます。

/* + TDDL:cmd_extra(PURE_ASYNC_DDL_MODE=true)* /
ALTER TABLE 'bmsql_order_line 'ADD GLOBAL INDEX 'g_i_ol_d_id'('ol_d_id ') partition by hash('ol_d_id') partition 32; 

show ddl statusコマンドを実行して、DDLステートメントの実行ステータスを表示できます。

ショーのddlの状態;
+ ---------------------------------- + ----------
| メトリック | 値 |
+ ---------------------------------- + ----------
| BACKFILL_PARALLELISM | 32 |
| BACKFILL_ROWS_FINISHED | 288679866 |
| BACKFILL_ROWS_SPEED | 150186 |
| BACKFILL_TASK_FAILED | 0 |
| BACKFILL_TASK_FINISHED | 1 |
| BACKFILL_TASK_TOTAL | 0 |
| BACKFILL_TIME_MILLIS | 3450 |
| CHANGESET_APPLY_PARALLELISM | 0 |
| CHANGESET_APPLY_ROWS_SPEED | 0 |
| CHECKER_ROWS_FINISHED | 0 |
| CHECKER_TIME_MILLIS | 0 |
| 696412 | |
| DDL_JOBS_FINISHED | 5 |
| DDL_JOBS_TOTAL | 6 |
| DDL_TASK_FAILED | 4 |
| DDL_TASK_FINISHED | 107 |
| DDL_TASK_TOTAL | 63 |
| FASTCHECKER_TASK_RUNNING | 0 |
| FASTCHECKER_TASK_WAITING | 0 |
| FASTCHECKER_THREAD_POOL_MAX_SIZE | 1 |
| FASTCHECKER_THREAD_POOL_NOW_SIZE | 0 |
| FASTCHECKER_THREAD_POOL_NUM | 2 |
| THROTTLE_RATE | 150000 |
+ ---------------------------------- + ---------- 

あなたが注意を払う必要があるパラメータ:

  • BACKFILL_PARALLESIM: アクティブなバックフィルスレッドの総数。

  • BACKFILL_ROWS_SPEED: 行ごとの現在の埋め戻しレート。

  • THROTTLE_RATE: レート制限。

この場合、DDLバックフィルレートはTHROTTLE_RATEパラメーターで指定された値の影響を受け、約150,000行 /秒に制限されます。 最大DOPを使用してスロットリングをキャンセルする場合は、次の方法で論理実行用のDDLステートメントを送信できます。

/* + TDDL:cmd_extra(SLIDE_WINDOW_TIME_INTERVAL=0,PURE_ASYNC_DDL_MODE=true,PHYSICAL_TABLE_BACKFILL_PARALLELISM=8,GSI_BACKFILL_PARALLELISM=32,GSI_BACKFILL_SPEED_LIMITATION=-1)* /
ALTER TABLE bmsql_order_line ADDグローバルインデックスg_i_ol_d_id('ol_d_id ') partition by hash('ol_d_id') partition 32; 

show ddl statusコマンドを実行して、DDLステートメントの実行ステータスを表示できます。

ショーのddlの状態;
+ ---------------------------------- + ---------
| メトリック | 値 |
+ ---------------------------------- + ---------
| BACKFILL_PARALLELISM | 32 |
| BACKFILL_ROWS_FINISHED | 37272038 |
| BACKFILL_ROWS_SPEED | 867669 |
| BACKFILL_TASK_FAILED | 0 |
| BACKFILL_TASK_FINISHED | 1 |
| BACKFILL_TASK_TOTAL | 0 |
| BACKFILL_TIME_MILLIS | 3450 |
| CHANGESET_APPLY_PARALLELISM | 0 |
| CHANGESET_APPLY_ROWS_SPEED | 0 |
| CHECKER_ROWS_FINISHED | 0 |
| CHECKER_TIME_MILLIS | 0 |
| 112397 | |
| DDL_JOBS_FINISHED | 3 |
| DDL_JOBS_TOTAL | 4 |
| DDL_TASK_FAILED | 2 |
| DDL_TASK_FINISHED | 75 |
| DDL_TASK_TOTAL | 42 |
| FASTCHECKER_TASK_RUNNING | 0 |
| FASTCHECKER_TASK_WAITING | 0 |
| FASTCHECKER_THREAD_POOL_MAX_SIZE | 1 |
| FASTCHECKER_THREAD_POOL_NOW_SIZE | 0 |
| FASTCHECKER_THREAD_POOL_NUM | 2 |
| THROTTLE_RATE | -1 |
+ ---------------------------------- + ---------
セットの23行 (0.02秒)

この場合、DDLバックフィル率は制限されない。 32スレッドすべてが実行されている場合、バックフィル率は860,000行 /秒に達します。

パフォーマンステスト

  • テスト用のPolarDB-Xインスタンスの仕様: 2つのCNと2つのDN。それぞれが16のCPUコアと64 GBのメモリを備えています。

  • テーブルスキーマ: TPC-CからAUTOモードのデータベースのbmsql_order_lineテーブル。

    CREATE TABLE 'bmsql_order_line '(
            'ol_w_id 'int(11) NOT NULL、
            'ol_d_id 'tinyint (4) NOT NULL,
            'ol_o_id 'int(11) NOT NULL、
            'ol_number' tinyint (4) NOT NULL,
            'ol_i_id 'int(11) NOT NULL、
            'ol_delivery_d 'タイムスタンプNOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP、
            'ol_amount decimal (6,2) DEFAULT NULL、
            'ol_supply_w_id 'int(11) DEFAULT NULL、
            'ol_quantity' int(11) DEFAULT NULL、
            'ol_dist_info 'char (24) COLLATE latin1_bin DEFAULT NULL、
            PRIMARYキー ('ol_w_id ', 'ol_d_id', 'ol_o_id ', 'ol_number')
    ) エンジン=InnoDB DEFAULT CHARSET = latin1 DEFAULT COLLATE = latin1_bin
    PARTITION BY KEY('ol_w_id ')
    パーティー32 
  • テストデータ: Benchmark Bootを使用して、TPC-C 10000ウェアハウスのデータをインポートできます。 合計で約30億行のデータが使用され、そのサイズは230 GBです。

テスト1: ローカルインデックスの追加

DOPパラメーターを設定し、次のステートメントを実行します。 show ddl statusコマンドを実行して、DDLステートメントの実行ステータスを表示します。

/* + TDDL:cmd_extra(PURE_ASYNC_DDL_MODE=true,ENABLE_TWO_PHASE_DDL=false,ENBALE_DRDS_MULTI_PHASE_DDL=false,MERGE_DDL_CONCURRENT=true,MERGE_CONCURRENT=true,PREFETCH_SHARDS=xxx)* /

ALTER TABLE 'bmsql_order_line 'ADD LOCAL INDEX i_ol_o_id(ol_o_id); 

次の表に、パラメーター設定ごとの実行時間とリソース使用量を示します。

パラメーター設定

実行時間 (秒)

同時実行のスピードアップ

平均DN CPU使用率 (≤ CPUコア数)

平均DN IOPS使用量 (≤ 1)

PREFETCH_SHARDS=2 (デフォルト設定、DNあたりのDOP: 1)

6,880

1

135%

55%

PREFETCH_SHARDS=4 (DNあたりのDOP: 2)

3,503

1.96

240%

95%

PREFETCH_SHARDS=8 (DNあたりのDOP: 4)

2,514

2.69

470%

100%

PREFETCH_SHARDS=16 (DNあたりのDOP: 8)

2,152

3.19

896%

100%

PREFETCH_SHARDS=32 (DNあたりのDOP: 16)

1,954

3.52

1,590%

100%

テスト2: グローバルインデックスの追加

DOPパラメーターを設定し、次のステートメントを実行します。 show ddl statusコマンドを実行して、DDLステートメントの実行ステータスを表示します。

/* + TDDL:cmd_extra(PURE_ASYNC_DDL_MODE=true、SLIDE_WINDOW_TIME_INTERVAL=0、PHYSICAL_TABLE_BACKFILL_PARALLELISM=xxx、GSI_BACKFILL_SPEED_LIMITATION=xxx)*

パラメーター設定

実行時間 (秒)

同時実行のスピードアップ

平均DN CPU使用率 (≤ CPUコア数)

平均DN IOPS使用量 (≤ 1)

平均CN CPU使用率 (≤ CPUコア数)

PHYSICAL_TABLE_BACKFILL_PARALLELISM=1、GSI_BACKFILL_SPEED_LIMITATION=150000 (物理テーブルごとの同時実行なし、自動スロットリング)

17,441

1

190%

8%

357%

SLIDE_WINDOW_TIME_INTERVAL=0, PHYSICAL_TABLE_BACKFILL_PARALLELISM=4, GSI_BACKFILL_SPEED_LIMITATION=-1 (デフォルト設定、スロットリングなし)

7,124

2.45

594%

23%

723%

SLIDE_WINDOW_TIME_INTERVAL=0, PHYSICAL_TABLE_BACKFILL_PARALLELISM=8, GSI_BACKFILL_SPEED_LIMITATION=-1 (物理テーブルごとに8つの同時スレッド、スロットリングなし)

4,020

4.34

1,175%

54%

1,476%