このトピックでは、INSERT OVERWRITE SELECT
ステートメントについて説明します。これは、AnalyticDB for MySQLで使用される高性能データ書き込み方法です。
制御ポリシー機能の動作
INSERT OVERWRITE SELECT
ステートメントは、パーティション内の既存のデータをクリアしてから、パーティションにデータをバッチ書き込みします。
パーティションテーブルの場合、
INSERT OVERWRITE SELECT
ステートメントは、ステートメントに含まれるパーティションのデータのみを上書きします。パーティション分割されていないテーブルの場合、
INSERT OVERWRITE SELECT
文はテーブル全体をクリアし、データをバッチ書き込みします。
データ書き込みタスクは、各テーブルに対して連続して実行される。 各テーブルに対して一度に実行できる書き込みタスクは1つだけです。 この設定は変更されません。 各タスクのデータ書き込みパフォーマンスを確保し、クラスターの高負荷を防ぐため、デフォルトではクラスターごとに2つのタスクを同時に実行できます。 このデフォルト設定は変更しないことを推奨します。
同時書き込みタスクの数を変更する必要がある場合は、 チケットを起票してください。
特性とシナリオ
INSERT OVERWRITE SELECT
ステートメントには、次の特徴があります。
INSERT OVERWRITE SELECT
ステートメントを使用したデータ書き込みタスク中に、高パフォーマンスを確保するために大量のクラスターリソースが消費されます。 オフピーク時にこのステートメントを使用することを推奨します。書き込まれたデータは、データ書き込みタスクが進行中であるときには見えず、タスクが完了した後にのみ見えるようになる。
INSERT OVERWRITE SELECT
を使用してパーティションをAnalyticDB for MySQLに書き込むと、同じ名前の既存のパーティションのデータが上書きされます。データ書き込みタスクが完了すると、クエリのパフォーマンスを向上させるためにテーブルインデックスが作成されます。
INSERT OVERWRITE SELECT
は、次のシナリオに適しています。
データはパーティションごとにテーブルに書き込まれます。
テーブルのすべてのデータが初期化されます。
大量のデータがテーブルに書き込まれます。
注意事項
INSERT OVERWRITE SELECT
とリアルタイム書き込みステートメント (INSERT INTO、REPLACE INTO、DELETE、UPDATE) を同じテーブルで同時に実行しないでください。 そうでなければ、リアルタイムで書き込まれたデータは破棄される。
構文
INSERT OVERWRITE table_name (column_name[,...])
select_statement
Parameters
table_name
: ターゲットテーブルの名前。colum_name
: ターゲットテーブルの列の名前。select_statement
: SELECTステートメント。SELECTステートメントの各列のデータ型は、ターゲットテーブルの各列のデータ型と一致する必要があります。
SELECTステートメントの列数がターゲットテーブルの列数より大きい場合、データの書き込みは失敗します。 SELECTステートメントの列数がターゲットテーブルの列数よりも小さい場合、ターゲットテーブルの追加の列にはデフォルト値が自動的に入力されます。 デフォルト値を指定しない場合は、NULLが使用されます。
例
サンプルデータ
上書きをテストするためのテーブルとデータを準備します。
test_source
という名前のソーステーブルとtest_target
という名前のターゲットテーブルを作成します。CREATE TABLE test_source (a BIGINT, b BIGINT) DISTRIBUTE BY HASH(a);
CREATE TABLE test_target (a BIGINT, b BIGINT) ハッシュによる分配 (a) 値によるパーティション (b) LIFECYCLE 10;
test_source
ソーステーブルを初期化します。test_source値に挿入 (1,1); INSERT INTO test_source VALUES (1,2); INSERT INTO test_source VALUES (1,3); INSERT INTO test_source VALUES (2,1); INSERT INTO test_source VALUES (2,2); INSERT INTO test_source VALUES (2,3);
上書き
test_target
の宛先テーブルを初期化します。INSERT OVERWRITE test_target SELECT * FROM test_source WHERE a = 1;
test_target
テーブルを照会します。 次の情報が返されます。+ ----- ------ | 1 | 1 | | 1 | 2 | | 1 | 3 | + ----- + ------ +
パーティション1を上書きして、
test_target
テーブルにデータを書き込みます。INSERT OVERWRITE test_target (a、b) SELECT a,b FROM test_source WHERE a = 2およびb = 1;
test_target
テーブルを照会します。 次の情報が返されます。+ ----- ------ | 2 | 1 | | 1 | 2 | | 1 | 3 | + ----- + ------ +
パーティション2と3を上書きして、
test_target
テーブルにデータを書き込みます。INSERT OVERWRITE test_target SELECT * FROM test_source WHERE a = 2 AND b >= 2 AND b <= 3;
test_target
テーブルを照会します。 次の情報が返されます。+ ----- ------ | 2 | 1 | | 2 | 2 | | 2 | 3 | + ----- + ------ +
非同期書き込み
タスクを送信します。
[ジョブの送信]
ステートメントを実行して、非同期タスクを送信します。 例:
ジョブを送信
INSERT OVERWRITE adb_table
SELECT * からadb_external_table;
書き込みパフォーマンスの最適化
データ書き込みステートメントの先頭にヒント (/* direct_batch_load=true */
) を追加して、リソースを節約しながら書き込みタスクを高速化します。 例:
/* direct_batch_load=true * /
ジョブを送信
INSERT OVERWRITE adb_table
SELECT * からadb_external_table;
/* direct_batch_load=true */
ヒントは、AnalyticDB for MySQL V3.1.5以降でのみサポートされます。 パフォーマンスが改善されない場合、 チケットを起票してください。 クラスターのマイナーバージョンをクエリする方法については、AnalyticDB for MySQLクラスターのバージョンを照会するにはどうすればよいですか?
進行状況の照会
ジョブの送信
を使用してデータ書き込みタスクを送信すると、ジョブIDが返されます。 ジョブIDを使用して、書き込みタスクのステータスを照会します。 例:
SHOW JOB STATUS WHERE job='<job_id>';
書き込みタスクが完了すると、ステータス列にSUCCEEDEDが表示されます。