BUILD ジョブは、新しく書き込まれたデータを持つパーティションを再構築するために使用されます。これは、読み取りパフォーマンスの向上に役立ちます。再構築プロセス中に、システムはインデックスを作成し、冗長データをクリアし、非同期的に DDL 文を実行します。
概要
BUILD ジョブの実行中、システムはリアルタイムで書き込まれたデータと、そのデータに関連する履歴パーティションをマージし、インデックスを作成し、非同期的に DDL 文を実行します。パーティション内のデータに対して INSERT、UPDATE、または DELETE 文が実行された後、BUILD ジョブを実行してパーティションを再構築できます。BUILD ジョブは、データの変更がないパーティションは再構築しません。
BUILD ジョブは、テーブルレベルでスケジュールされます。異なるテーブルの BUILD ジョブは並列に実行できます。テーブルで BUILD ジョブが開始されると、ジョブはシャードレベルでタスクに分割されます。シャードの 3 つのレプリカはすべて、それぞれタスクを実行します。すべてのタスクが完了すると、BUILD ジョブは完了です。
使用上の注意
BUILD ジョブの実行中は、BUILD ジョブが完了するまで、
INSERT OVERWRITE SELECT文を実行してテーブルにデータを挿入することはできません。データを挿入する場合は、INSERT INTO文を実行できます。BUILD ジョブを発行した後は、ジョブをキャンセルすることはできません。
デフォルトでは、同時 BUILD ジョブの数は
コア数/3の切り上げ結果であり、変更できません。たとえば、AnalyticDB for MySQL クラスタのノード仕様が 32 コアおよび 128 GB メモリの場合、同時 BUILD ジョブの数は 11(
32/3の切り上げ結果)です。BUILD ジョブは、CPU、メモリ、および I/O リソースを消費します。その結果、CPU 使用率やディスク I/O 使用率などのディスク関連のメトリックが増加する可能性があります。BUILD ジョブが完了すると、メトリックは通常の値に戻ります。オフピーク時に BUILD ジョブを実行することをお勧めします。
BUILD ジョブの自動トリガー
次のいずれかの条件が満たされると、BUILD ジョブが自動的にトリガーされます。
最新の BUILD ジョブからの経過時間が、BUILD ジョブ間の最小時間間隔に達し、テーブルのシャードに少なくとも 50,000 行のデータが追加された場合。
Enterprise Edition、Basic Edition、または Data Lakehouse Edition の時間間隔:1.5 時間。
Data Warehouse Edition(elastic モード) の時間間隔:1.5 時間。
Data Warehouse Edition(reserved モード) の時間間隔:0.5 時間。
最新の BUILD ジョブから 24 時間が経過し、少なくとも 1 行のデータが変更された場合。
BUILD ジョブの手動トリガー
データが変更されたパーティションで BUILD 文を実行する
XUANWU テーブル
BUILD TABLE <table_name>;このメソッドは、データが変更されたパーティションでのみ BUILD ジョブをトリガーします。
XUANWU_V2 テーブル
BUILD TABLE <table_name> [BUILD_OPTION];BUILD_OPTION:ttl値のみをサポートします。これはオプションのパラメーターです。このパラメーターを空のままにすると、このメソッドは、データが変更されたパーティションでのみ BUILD ジョブをトリガーします。このパラメーターを指定すると、このメソッドは BUILD ジョブの完了後に期限切れのパーティションをすぐに削除します。
説明テーブルエンジンの決定方法と指定方法については、「XUANWU_V2 エンジン」トピックの「テーブルエンジンの指定」セクションをご参照ください。
特定のパーティションで BUILD 文を実行する
BUILD TABLE test force partitions='partition1,partition2';特定のパーティションで BUILD 文を実行できるのは、V3.1.6.0 以降の AnalyticDB for MySQL クラスタの場合のみです。AnalyticDB for MySQL クラスタのマイナーバージョンの表示方法については、「クラスタのマイナーバージョンを表示するにはどうすればよいですか?」をご参照ください。クラスタのマイナーバージョンを更新するには、テクニカルサポートにお問い合わせください。
テーブルに大量のデータが含まれている場合、BUILD TABLE <table_name> force = true; 文の実行に長時間を要する場合があります。AnalyticDB for MySQL では、BUILD ジョブを実行する partitions を指定できます。これにより、リソースの使用量が削減され、BUILD ジョブのパフォーマンスが向上します。
テーブル全体で BUILD 文を実行する
BUILD TABLE <table_name> force = true;このメソッドは、テーブルのすべてのパーティションで BUILD ジョブをトリガーし、インデックスを再作成します。デフォルトでは、この機能は無効になっています。
このメソッドは、テーブルの既存のすべてのデータのインデックスを再作成するため、長時間を要します。特定のパーティションで BUILD 文を実行することをお勧めします。テーブル全体で BUILD 文を実行する前に、影響とリスクを評価する必要があります。この機能を有効にするには、チケットを送信してください。
BUILD ジョブの自動スケジューリングを設定する
設定方法
SET ADB_CONFIG RC_CSTORE_BUILD_SCHEDULE_PERIOD=`<start>,<end>`;startパラメーターとendパラメーターは、BUILD ジョブをスケジュールする時間範囲を指定します。パラメーターを 0 ~ 24 の範囲で設定し、時間範囲をバックティック(` `)で囲みます。複数の時間範囲を設定できます。複数の時間範囲はセミコロン(;)で区切ります。たとえば、
startパラメーターを 0 に、endパラメーターを 6 に設定して、0:00 ~ 6:59 の間に BUILD ジョブをスケジュールできます。重要指定された時間範囲は、ジョブの実行ではなく、ジョブのスケジューリングに使用されます。したがって、ジョブがスケジュールされた後、時間範囲が終了したときにシステムがジョブの実行を完了していない可能性があります。
例
次の時間範囲(00:00 ~ 06:59 および 18:00 ~ 22:59)内に BUILD ジョブがスケジュールされるように設定します。
SET ADB_CONFIG RC_CSTORE_BUILD_SCHEDULE_PERIOD=`0,6;18,22`;上記ステートメントを実行すると、システムは 00:00 ~ 06:59 および 18:00 ~ 22:59 の間に BUILD ジョブをスケジュールします。
BUILD ジョブのスケジューリング優先順位を設定する
BUILD ジョブのスケジューリング順序は、テーブルの個々のシャードに追加されるデータ量に基づいています。テーブルのシャードに追加されるデータ量が多いほど、ジョブは早くスケジュールされ、実行されます。ヒントを使用するか、SET ADB_CONFIG 文を実行して、テーブルの BUILD ジョブのスケジューリング優先順位を設定することもできます。
BUILD ジョブのスケジューリング優先順位を設定できるのは、V3.1.5.0 以降の AnalyticDB for MySQL クラスタの場合のみです。
AnalyticDB for MySQL クラスタのマイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、クラスター情報 ページの 構成情報 セクションに移動します。
ヒントは 1 つのテーブルのみをサポートします。設定された優先順位は、現在の BUILD ジョブにのみ有効です。
SET ADB_CONFIG文は、1 つ以上のテーブルをサポートします。設定された優先順位は、テーブルの BUILD ジョブの新しいスケジューリング優先順位を設定するまで有効です。ヒントと
SET ADB_CONFIG文を使用してテーブルの BUILD ジョブの異なるスケジューリング優先順位を設定した場合、現在のジョブではヒントベースのスケジューリング優先順位が優先されます。
task_priority パラメーターは、BUILD ジョブのスケジューリング優先順位を指定します。値は整数である必要があります。デフォルト値は 0 です。値が大きいほど、スケジューリング優先順位が高くなります。BUILD ジョブの優先順位を設定すると、フロントエンドノードは優先順位に基づいて BUILD ジョブをスケジュールします。テーブルの task_priority パラメーターを 0 未満の値に設定すると、テーブルの BUILD ジョブの自動スケジューリングは無効になり、フロントエンドノードはテーブルの BUILD ジョブをスケジュールしません。
設定方法:
ヒントを使用する
/*build_task_priority = <task_priority> */ BUILD TABLE <db_name>.<table_name>;たとえば、
adb_demoデータベースのtestテーブルの BUILD ジョブのスケジューリング優先順位を 30 に設定します。/*build_task_priority = 30 */ Build TABLE adb_demo.test;SET ADB_CONFIG 文を使用する
異なるデータベースの複数のテーブルの BUILD ジョブのスケジューリング優先順位を設定します。
SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `<db1_name>.<table1_name>.<task_priority>;<db2_name>.<table2_name>.<task_priority>`;説明複数のテーブルはセミコロン(;)で区切ります。
たとえば、
adb_demo1データベースのtest1テーブルの BUILD ジョブのスケジューリング優先順位を 30 に、adb_demo2データベースのtest2テーブルのスケジューリング優先順位を 10 に設定します。SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `adb_demo1.test1.30;adb_demo2.test2.10`;データベース内のすべてのテーブルに同じ BUILD ジョブのスケジューリング優先順位を設定します。
SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `<db1_name>.*.<task_priority>`;たとえば、
adb_demo1データベースのすべてのテーブルの BUILD ジョブのスケジューリング優先順位を 30 に設定します。SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `adb_demo1.*.30`;同じデータベース内のテーブルと他のテーブルの間で異なる BUILD ジョブのスケジューリング優先順位を設定します。
SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `<db1_name>.*.<task_priority>;<db1_name>.<table_name>.<task_priority>`;たとえば、
adb_demo1データベースのtest1テーブルの BUILD ジョブのスケジューリング優先順位を 30 に、データベース内の他のすべてのテーブルのスケジューリング優先順位を 10 に設定します。SET ADB_CONFIG RC_BUILD_TASK_PRIORITY_LIST = `adb_demo1.*.10;adb_demo1.test1.30`;
SHOW ADB_CONFIG 文を実行して、BUILD ジョブの現在のスケジューリング優先順位をクエリできます。
BUILD ジョブのステータスをクエリする
BUILD ジョブが自動または手動でトリガーされた後、次の SQL 文を実行して、過去 3 日間の BUILD ジョブのステータスをクエリできます。
SELECT table_name, schema_name, status FROM INFORMATION_SCHEMA.KEPLER_META_BUILD_TASK ORDER BY create_time DESC LIMIT 10;次の表は、status パラメーターの値に基づいた BUILD ジョブのステータスを示しています。
| 説明 |
INIT | ジョブは初期化中です。 |
RUNNING | ジョブは実行中です。 |
FINISH | ジョブは完了です。 |
よくある質問
BUILD ジョブの自動スケジューリングが有効にならないのはなぜですか?
原因:時間関連のパラメーターがバックティック(` `)で囲まれていません。その結果、パラメーターの解析に失敗します。
解決策:SET ADB_CONFIG RC_CSTORE_BUILD_SCHEDULE_PERIOD 文を実行して自動スケジューリングを設定する場合は、開始パラメーターと終了パラメーターをバックティック(` `)で囲みます。たとえば、SET ADB_CONFIG RC_CSTORE_BUILD_SCHEDULE_PERIOD=`0,6`; は、0:00 ~ 6:59 の間にシステムが BUILD ジョブをスケジュールすることを指定します。