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

AnalyticDB:INSERT OVERWRITE SELECT

最終更新日:Aug 22, 2026

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 が設定されます。

例

サンプルデータ

上書きの例として、テストテーブルとデータを準備します。

  1. 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;
  2. ソーステーブル 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);

データの上書き

  1. test_target テーブルに初期データを挿入します。

    INSERT OVERWRITE test_target 
    SELECT * FROM test_source WHERE a = 1;

    test_target テーブルをクエリすると、次の結果が返されます。

    +-----+------+
    |1    |1     |
    |1    |2     |
    |1    |3     |
    +-----+------+
  2. 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     |
    +-----+------+
  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 の場合、ジョブは完了しています。