StarRocks の INSERT INTO は MySQL と同様に機能しますが、各実行はインプレース書き込みではなく、独立したインポートジョブとして実行されます。ステートメントが完了すると、結果は同期的に返されます。これを使用して、検証のために少数の行をロードしたり、StarRocks テーブル間で抽出・変換・書き出し (ETL) 変換を実行したりします。
利用シーン
-
テストデータのロード:完全なパイプラインを構築する前に、いくつかの行を挿入してテーブル構造や StarRocks の動作を検証します。
-
StarRocks テーブル間の ETL:
INSERT INTO SELECTを使用して、ある StarRocks テーブルのデータを変換し、その結果を別のテーブルに書き込みます。 -
外部テーブルからのロード:外部の MySQL テーブルを外部テーブルとしてマッピングし、
INSERT INTO SELECTを使用してそのデータを StarRocks の内部テーブルにロードします。
INSERT INTO は、本番環境での定常的な取り込みには適していません。各実行で新しいデータバージョンが作成され、頻繁な小規模な挿入は過剰なバージョンを生成し、クエリパフォーマンスを低下させます。ストリーミングや高頻度の小規模バッチ取り込みには、代わりに Stream Load または Routine Load を使用してください。
構文
INSERT INTO table_name
[ PARTITION (p1, ...) ]
[ WITH LABEL label ]
[ (column [, ...]) ]
[ [ hint [, ...] ] ]
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
パラメーター
| パラメーター | 説明 |
|---|---|
table_name |
宛先テーブル。db_name.table_name フォーマットを使用します。 |
PARTITION |
データをロードするパーティション。パーティションは table_name に存在する必要があります。複数のパーティション名はカンマで区切ります。省略した場合、データはすべてのパーティションにロードされます。 |
label |
データベース内でインポートジョブを一意に識別する ID。自動生成されるラベルに頼るのではなく、手動でラベルを指定してください。ネットワークエラーで接続が切断された場合でも、既知のラベルがあれば後でジョブの結果をクエリできます。 |
column_name |
書き込み先のカラム。カラムは任意の順序でリストできます。省略した場合、table_name のすべてのカラムが使用されます。宛先カラムにマッピングされていないソースカラムにはデフォルト値が必要で、そうでない場合はステートメントが失敗します。カラムの型が異なる場合、暗黙的な変換が試みられます。変換に失敗すると、構文解析エラーが返されます。 |
expression |
カラムに値を割り当てる式。 |
DEFAULT |
カラムのデフォルト値を割り当てます。 |
query |
結果セットが宛先テーブルに書き込まれるクエリ文。StarRocks がサポートするすべての SQL ステートメントが有効です。 |
VALUES |
1 つ以上のリテラルデータ行。迅速なデモ検証にのみ使用し、テストや本番環境では使用しないでください。複数の行をロードする場合は、INSERT INTO SELECT を推奨します。 |
前提条件
開始する前に、以下が揃っていることを確認してください:
-
StarRocks 内の宛先テーブル
-
そのテーブルへの書き込みに必要な権限
サンプルテーブルのセットアップ
このトピックの例では、以下のデータベースとテーブルを使用します。これらのステートメントを実行してセットアップしてください。
-
データベースを作成します:
CREATE DATABASE IF NOT EXISTS load_test; -
データベースに切り替えます:
USE load_test; -
宛先テーブルを作成します:
CREATE TABLE insert_wiki_edit ( event_time DATETIME, channel VARCHAR(32) DEFAULT '', user VARCHAR(128) DEFAULT '', is_anonymous TINYINT DEFAULT '0', is_minor TINYINT DEFAULT '0', is_new TINYINT DEFAULT '0', is_robot TINYINT DEFAULT '0', is_unpatrolled TINYINT DEFAULT '0', delta INT SUM DEFAULT '0', added INT SUM DEFAULT '0', deleted INT SUM DEFAULT '0' ) AGGREGATE KEY(event_time, channel, user, is_anonymous, is_minor, is_new, is_robot, is_unpatrolled) PARTITION BY RANGE(event_time) ( PARTITION p06 VALUES LESS THAN ('2015-09-12 06:00:00'), PARTITION p12 VALUES LESS THAN ('2015-09-12 12:00:00'), PARTITION p18 VALUES LESS THAN ('2015-09-12 18:00:00'), PARTITION p24 VALUES LESS THAN ('2015-09-13 00:00:00') ) DISTRIBUTED BY HASH(user) BUCKETS 10 PROPERTIES("replication_num" = "1");
VALUES を使用した行の挿入
INSERT INTO VALUES を使用して、少数のリテラル行をテーブルに直接書き込みます。これは迅速な検証のみを目的としており、本番環境や性能テストには使用しません。
INSERT INTO insert_wiki_edit VALUES
("2015-09-12 00:00:00","#en.wikipedia","GELongstreet",0,0,0,0,0,36,36,0),
("2015-09-12 00:00:00","#ca.wikipedia","PereBot",0,1,0,1,0,17,17,0);
期待される出力:
Query OK, 2 rows affected (0.29 sec)
{'label':'insert_1f12c916-5ff8-4ba9-8452-6fc37fac2e75', 'status':'visible', 'txnId':'601'}
2 rows affected は、両方の行がロードされたことを確認します。status: visible は、データがすぐにクエリ可能であることを意味します。
INSERT INTO SELECT を使用したデータのロード
INSERT INTO SELECT を使用して、別の StarRocks テーブルからデータをロードしたり、ロードの一部として ETL 変換を実行したりします。
接続が切断された場合でも結果をクエリできるように、ジョブにラベルを割り当てます:
INSERT INTO insert_wiki_edit WITH LABEL insert_load_wikipedia
SELECT * FROM routine_wiki_edit;
期待される出力:
Query OK, 18203 rows affected (0.40 sec)
{'label':'insert_load_wikipedia', 'status':'visible', 'txnId':'618'}
インポートジョブのステータスの確認
結果が返される前に接続が切断された場合は、ラベルを使用してジョブのステータスをクエリします。SHOW LOAD ステートメントを実行し、ラベルを使用してジョブを特定します。返された結果の URL を使用して、エラーデータをクエリすることもできます。
ラベルを割り当てなかった場合は、インポート結果から自動生成されたラベルを使用して同じクエリを実行します。
戻り値の理解
成功した INSERT INTO ステートメントは、実行直後にステータス行を返します。次の表に各フィールドの説明を示します。
| フィールド | 説明 |
|---|---|
rows affected |
ロードされた総行数。 |
warnings |
フィルターで除外された (ロードから除外された) 行数。 |
label |
インポートジョブの識別子。WITH LABEL で指定されていない場合は自動生成されます。 |
status |
visible:ロードされたデータはすぐにクエリ可能です。committed:インポートされたデータは非表示です。 |
txnId |
このインポートジョブのトランザクション ID。 |
err |
予期しないエラーが発生した場合にのみ表示されます。返された URL と共に SHOW LOAD を使用して、フィルターで除外された行を調査します。 |
戻り値の例
空のソーステーブル — ロードされた行なし:
Query OK, 0 rows affected (0.02 sec)
自動生成ラベルでのロード成功 — 4 行がロードされ、データはすぐにクエリ可能:
Query OK, 4 rows affected (0.38 sec)
{'label':'insert_8510c568-9eda-4173-9e36-6adc7d35291c', 'status':'visible', 'txnId':'4005'}
カスタムラベルでのロード成功 — 同じ結果、ラベルはユーザー指定:
Query OK, 4 rows affected (0.38 sec)
{'label':'my_label1', 'status':'visible', 'txnId':'4005'}
フィルターされた行がある部分的なロード — 2 行がロードされ、フォーマットエラーのため 2 行が除外:
Query OK, 2 rows affected, 2 warnings (0.31 sec)
{'label':'insert_f0747f0e-7a35-46e2-affa-13a235f4020d', 'status':'visible', 'txnId':'4005'}
これは status: committed を返すこともあり、インポートされたデータが非表示であることを意味します。
ロード失敗 — すべての行が拒否され、データはロードされず:
ERROR 1064 (HY000): all partitions have no load data. url: http://10.74.167.16:8042/api/_load_error_log?file=__shard_2/error_log_insert_stmt_ba8bb9e158e4879-ae8de8507c0bf8a2_ba8bb9e158e4879_ae8de8507c0bf8a2
URL を開いて、失敗の原因となった行を調査します。
設定
FE ノードパラメーター
| パラメーター | デフォルト | 説明 |
|---|---|---|
insert_load_default_timeout_second |
3600 (1 時間) | すべての INSERT INTO インポートジョブのタイムアウト (秒単位)。この設定はグローバルに適用され、個々のジョブに異なるタイムアウトを設定することはできません。ジョブがこの制限を超えると、キャンセルされて CANCELLED 状態に移行します。ジョブが頻繁にタイムアウトする場合は、フロントエンド (FE) ノードでこの値を調整してください。 |
セッションパラメーター
| パラメーター | デフォルト | 説明 |
|---|---|---|
enable_insert_strict |
true |
ジョブが無効な行をどのように処理するかを制御します。true:いずれかの行がフィルターで除外された場合、ジョブは失敗します。false:少なくとも 1 行がロードされればジョブは成功します。部分的な失敗の場合はラベルが返されます。SET enable_insert_strict = false で設定します。 |
query_timeout |
— | セッションレベルのクエリタイムアウト (秒単位)。INSERT INTO はこのタイムアウトの影響を受けます。ロードジョブが FE レベルのタイムアウトより前にタイムアウトする場合は、SET query_timeout = <seconds> でこの値を増やしてください。 |
注意事項
-
デフォルトでは、宛先テーブルのフォーマットに準拠しない行 (例えば、宣言された長さを超える文字列) は、警告なしにフィルターで除外されます。フィルター処理の代わりにジョブを失敗させるには、
enable_insert_strict = trueを設定します。 -
各
INSERT INTOの実行は新しいデータバージョンを生成します。本番環境で高頻度で実行することは避けてください。過剰なバージョンはクエリパフォーマンスを低下させます。
次のステップ
-
Stream Load — 高スループットまたはストリーミング取り込み用
-
Routine Load — メッセージキューからの継続的な取り込み用