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

AnalyticDB for MySQL:上書き選択を挿入する

最終更新日:Jun 11, 2024

このトピックでは、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 INTOREPLACE INTODELETEUPDATE) を同じテーブルで同時に実行しないでください。 そうでなければ、リアルタイムで書き込まれたデータは破棄される。

構文

INSERT OVERWRITE table_name (column_name[,...])
select_statement 

Parameters

  • table_name: ターゲットテーブルの名前。

  • colum_name: ターゲットテーブルの列の名前。

  • select_statement: SELECTステートメント。

    SELECTステートメントの各列のデータ型は、ターゲットテーブルの各列のデータ型と一致する必要があります。

    SELECTステートメントの列数がターゲットテーブルの列数より大きい場合、データの書き込みは失敗します。 SELECTステートメントの列数がターゲットテーブルの列数よりも小さい場合、ターゲットテーブルの追加の列にはデフォルト値が自動的に入力されます。 デフォルト値を指定しない場合は、NULLが使用されます。

サンプルデータ

上書きをテストするためのテーブルとデータを準備します。

  1. 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; 
  2. 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); 

上書き

  1. test_targetの宛先テーブルを初期化します。

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

    test_targetテーブルを照会します。 次の情報が返されます。

    + ----- ------
    | 1 | 1 |
    | 1 | 2 |
    | 1 | 3 |
    + ----- + ------ + 
  2. パーティション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 |
    + ----- + ------ + 
  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が表示されます。