StarRocks での INSERT INTO ステートメントの使い方は、MySQL やその他のデータベースと似ています。ただし、StarRocks では、すべてのデータ書き込みは独立したインポートジョブを使用して実行されます。したがって、INSERT INTO は StarRocks ではインポートメソッドとして記述されます。このトピックでは、INSERT INTO インポートメソッドのシナリオ、構成、および例について説明します。
シナリオ
- INSERT INTO ステートメントを実行してデータをインポートすると、結果は同期的に返されます。
- StarRocks システムをテストするために少数のデータ行をインポートする場合、INSERT INTO VALUES ステートメントを実行できます。
- StarRocks テーブルのデータに対して抽出、変換、ロード (ETL) 操作を実行し、そのデータを別の StarRocks テーブルにインポートする場合、INSERT INTO SELECT ステートメントを実行できます。
- 外部テーブルを作成できます。たとえば、MySQL テーブルのデータをマッピングする MySQL 外部テーブルを作成します。その後、INSERT INTO SELECT ステートメントを実行して、外部テーブルのデータを StarRocks テーブルにインポートできます。
注意事項
- デフォルトでは、INSERT INTO ステートメントを実行すると、宛先テーブルの形式要件に準拠していないデータは除外されます。たとえば、指定された長さを超える文字列は除外されます。データを除外できないビジネスシナリオでは、enable_insert_strict セッション変数を true に設定して、データが除外された場合に INSERT INTO ステートメントが実行されないようにすることができます。
- StarRocks では、INSERT INTO ステートメントはインポートデータロジックを再利用します。その結果、INSERT INTO ステートメントを実行するたびに新しいデータバージョンが生成されます。少量のデータをインポートする操作を頻繁に実行すると、過剰なデータバージョンが生成されます。これはクエリのパフォーマンスに影響します。実稼働環境では、INSERT INTO ステートメントを頻繁に実行してデータをインポートしたり、ルーチンインポートジョブとして使用したりしないことをお勧めします。ストリームデータまたは小バッチのデータをインポートする必要がある場合は、ストリームロード または ルーチンロード メソッドを使用できます。
基本操作
構文
INSERT INTO table_name
[ PARTITION (p1, ...) ]
[ WITH LABEL label]
[ (column [, ...]) ]
[ [ hint [, ...] ] ]
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }| パラメーター | 説明 |
| table_name | データをインポートする宛先テーブルの名前。db_name.table_name 形式でテーブル名を入力します。 |
| partitions | データをインポートするパーティションを指定します。指定するパーティションは、table_name テーブルに存在する必要があります。複数のパーティション名はコンマ (,) で区切ります。パーティションを指定すると、パーティションの要件を満たすデータのみがインポートされます。このパラメーターを空のままにすると、デフォルト値は table_name テーブルのすべてのパーティションの名前になります。 |
| label | インポートジョブのラベルを指定します。ラベルは、INSERT INTO ジョブを識別するために使用されます。各インポートジョブは、単一のデータベース内で一意のラベルを持ちます。 重要 システムによって自動的に割り当てられるラベルを使用する代わりに、インポートジョブのラベルを指定することをお勧めします。システムによって割り当てられたラベルを使用する場合、ネットワークエラーによって接続が閉じられたときに INSERT INTO ステートメントの実行結果を知ることはできません。インポートジョブのラベルを指定すると、ラベルを使用して INSERT INTO ステートメントの実行結果をクエリできます。 |
| column_name | 宛先列を指定します。列は table_name テーブルに存在する必要があります。 ソーステーブルからデータをインポートする宛先列。列は任意の順序で存在できます。デフォルトでは、このパラメーターを空のままにすると、table_name テーブルのすべての列が宛先列になります。ソーステーブルの列が宛先列に存在しない場合、その列にはデフォルト値が必要です。そうでない場合、INSERT INTO ステートメントは実行に失敗します。クエリステートメントによって返される列の型が宛先列の型と異なる場合、暗黙的な変換が実行されます。変換に失敗すると、INSERT INTO ステートメントは構文解析エラーを返します。 |
| expression | 列に値を割り当てる式。 |
| default | 列にデフォルト値を割り当てます。 |
| query | 結果が宛先テーブルに書き込まれる一般的なクエリステートメント。StarRocks でサポートされているすべての SQL ステートメントを使用できます。 |
| values | INSERT INTO VALUES ステートメントを実行することで、1 つ以上のデータ行を書き込むことができます。 重要 INSERT INTO VALUES ステートメントを実行して、いくつかのデータ行を使用してデモを確認できます。このステートメントは、テスト環境または実稼働環境には適用できません。StarRocks は、単一のデータ行のみがインポートされるシナリオには適していません。INSERT INTO SELECT ステートメントを実行して複数のデータ行をインポートすることをお勧めします。 |
インポート結果
- 正常に実行された場合のサンプル結果
- 例 1
insert into tbl1 select * from empty_tbl;ステートメントを実行します。次の結果が返されます。Query OK, 0 rows affected (0.02 sec) - 例 2
insert into tbl1 select * from tbl2;ステートメントを実行します。次の結果が返されます。Query OK, 4 rows affected (0.38 sec) {'label':'insert_8510c568-9eda-4173-9e36-6adc7d35291c', 'status':'visible', 'txnId':'4005'} - 例 3
insert into tbl1 with label my_label1 select * from tbl2;ステートメントを実行します。次の結果が返されます。Query OK, 4 rows affected (0.38 sec) {'label':'my_label1', 'status':'visible', 'txnId':'4005'} - 例 4
insert into tbl1 select * from tbl2;ステートメントを実行します。次の結果が返されます。Query OK, 2 rows affected, 2 warnings (0.31 sec) {'label':'insert_f0747f0e-7a35-46e2-affa-13a235f4020d', 'status':'visible', 'txnId':'4005'}次の結果が返される場合もあります。Query OK, 2 rows affected, 2 warnings (0.31 sec) {'label':'insert_f0747f0e-7a35-46e2-affa-13a235f4020d', 'status':'committed', 'txnId':'4005'}
戻り結果に含まれるパラメーターを次の表に示します。パラメーター 説明 rows affected インポートされたデータ行の総数を示します。 warnings 除外されたデータ行の数を示します。 status インポートされたデータが表示されるかどうかを示します。有効な値: - visible:インポートされたデータが表示されます。
- committed:インポートされたデータは表示されません。
txnId INSERT トランザクションの ID。 err 予期しないエラーを示します。除外されたデータ行を表示する必要がある場合は、SHOW LOAD ステートメントを実行できます。戻り結果の URL を使用して、エラーデータをクエリできます。 - 例 1
- 失敗した場合のサンプル結果
実行に失敗した場合、データはインポートされません。
たとえば、insert into tbl1 select * from tbl2 where k1 = "a";ステートメントを実行します。次の結果が返されます。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](http://10.74.**.**:8042/api/_load_error_log?file=__shard_2/error_log_insert_stmt_ba8bb9e158e4879-ae8de8507c0bf8a2_ba8bb9e158e4879_ae8de8507c0bf8a2)戻り結果の
ERROR 1064 (HY000): all partitions have no load dataエラーは、失敗の原因を示しています。URL を使用して、エラーデータをクエリできます。
関連パラメーター
FE ノードのパラメーター
timeout: インポートジョブのタイムアウト期間。単位:秒。指定されたタイムアウト期間内にインポートジョブが完了しない場合、システムはジョブをキャンセルします。この場合、ジョブは CANCELLED 状態になります。INSERT INTO ステートメントの実行は、カスタムタイムアウト期間をサポートしていません。INSERT INTO インポートメソッドを使用するすべてのインポートジョブのタイムアウト期間は同じです。デフォルトのタイムアウト期間は 1 時間です。インポートタスクが指定されたタイムアウト期間内に完了しない場合は、フロントエンド (FE) ノードの insert_load_default_timeout_second パラメーターの値を調整する必要があります。
セッションパラメーター
| パラメーター | 説明 |
| enable_insert_strict | INSERT INTO インポートメソッドは、インポートジョブの許容可能な失敗率を制御できません。enable_insert_strict セッションパラメーターを設定して、インポートジョブの許容可能な失敗率を制御できます。有効な値:
|
| query_timeout | INSERT INTO ステートメントも SQL ステートメントです。その結果、INSERT INTO ステートメントは query_timeout セッションパラメーターによって制限されます。SET query_timeout = xxx コマンドを実行することで、タイムアウト期間を増やすことができます。タイムアウト期間は秒単位で測定されます。 |
例
データベースとテーブルの作成
- 次のステートメントを実行してデータベースを作成します。
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");
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'}INSERT INTO SELECT ステートメントを実行してデータをインポートする
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'}