INSERT OVERWRITE SELECT は、パーティションデータをクリアし、新しいデータを一括で書き込むことで、AnalyticDB for MySQL テーブルへの高パフォーマンスなバッチデータ書き込みを実現します。
仕組み
INSERT OVERWRITE SELECT 文は、まずパーティション内の既存データをすべてクリアし、その後新しいデータを一括で書き込みます。
-
ターゲットテーブルがパーティションテーブルの場合、
INSERT OVERWRITE SELECTは新しいデータが属するパーティションのみを上書きします。その他のパーティションは影響を受けません。 -
ターゲットテーブルが非パーティション化テーブルの場合、
INSERT OVERWRITE SELECTはテーブル内の既存データをすべてクリアしてから、新しいデータを一括で書き込みます。
単一テーブルへの書き込みジョブは順次実行されます (同時実行数は 1 に固定)。 デフォルトのクラスターレベルの書き込み同時実行数は 2 です。この値は調整しないでください。パフォーマンスが低下し、クラスターに過負荷がかかる可能性があります。
書き込み同時実行数を調整する場合は、 チケットを起票 して、テクニカルサポートに評価を依頼してください。
概要
主な特徴:
-
高リソース消費: クラスターのパフォーマンスに影響を与えないよう、オフピーク時間に実行してください。
-
バッチ可視性:書き込まれたデータは、ジョブ完了後に一度にすべて参照可能になります。
-
パーティション上書き:新しいデータを含むパーティションのみが上書きされます。
-
自動インデックス構築:書き込み中にインデックスが同期的に構築されるため、ジョブ完了後すぐにターゲットテーブルでクエリを実行できます。
一般的なユースケース:
-
パーティションレベルのデータ書き込み。
-
データ初期化 (全量データ書き込み)。
-
大規模な一括データ書き込み。少量のデータには推奨されません。
注意事項
INSERT OVERWRITE SELECT とリアルタイム書き込み方法 (INSERT INTO、REPLACE INTO、DELETE、UPDATE など) を同じテーブルに同時に使用しないでください。同時に使用すると、リアルタイム書き込みのデータが失われます。
構文
INSERT OVERWRITE table_name (column_name[,...])
select_statement
パラメーター
-
table_name: ターゲットテーブルの名前。 -
column_name: ターゲットテーブル内のカラム名。 -
select_statement: SELECT 文。SELECT 文内の各カラムのデータ型は、ターゲットテーブルの対応するカラムのデータ型と一致する必要があります。
SELECT 文のカラム数がターゲットテーブルのカラム数より多い場合、書き込み操作は失敗します。SELECT 文のカラム数がターゲットテーブルのカラム数より少ない場合、ターゲットテーブルの残りのカラムにはデフォルト値が設定されます。カラムにデフォルト値がない場合、NULL が設定されます。
例
サンプルデータ
上書きの例として、テストテーブルとデータを準備します。
-
test_sourceという名前のソーステーブルと、test_targetという名前のターゲットテーブルを作成します。CREATE TABLE test_source (a BIGINT, b BIGINT) DISTRIBUTED BY HASH(a);CREATE TABLE test_target (a BIGINT, b BIGINT) DISTRIBUTED BY HASH(a) PARTITION BY VALUE(b) LIFECYCLE 10; -
ソーステーブル
test_sourceにテストデータを書き込みます。INSERT INTO test_source VALUES (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 | +-----+------+ -
test_targetテーブルのb=1のパーティションを上書きします。INSERT OVERWRITE test_target (a,b) SELECT a,b FROM test_source WHERE a = 2 AND b = 1;上書き後に
test_targetをクエリすると、次の結果が返されます。+-----+------+ |2 |1 | |1 |2 | |1 |3 | +-----+------+ -
test_targetテーブルのb=2およびb=3のパーティションを上書きします。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 | +-----+------+
非同期書き込み
ジョブの送信
SUBMIT JOB は、書き込み操作をバックグラウンドで非同期に実行します:
SUBMIT JOB
INSERT OVERWRITE adb_table
SELECT * FROM adb_external_table;
書き込みパフォーマンスの最適化
書き込み操作の前にヒント /* direct_batch_load=true */ を追加すると、リソース消費を抑えつつパフォーマンスを向上させることができます:
/* direct_batch_load=true*/
SUBMIT JOB
INSERT OVERWRITE adb_table
SELECT * FROM adb_external_table;
/* direct_batch_load=true*/ にはカーネルバージョン 3.1.5 以降が必要です。パフォーマンスが向上しない場合は、 チケットを起票 してサポートを依頼してください。カーネルバージョンを確認するには、 インスタンスバージョン情報の表示をご参照ください。
ジョブの進行状況の確認
SUBMIT JOB は job_id を返します。これを使用してジョブのステータスを照会します:
SHOW JOB STATUS WHERE job='<job_id>';
ステータスが SUCCEEDED の場合、ジョブは完了しています。