INSERT 文を実行すると、特定のテーブルに新しい行を挿入できます。このトピックでは、Hologres で INSERT 文を使用する方法について説明します。
構文
Hologres のテーブルには、値式で指定する 1 つ以上の行、またはクエリから返される 0 個以上の行を挿入できます。INSERT 文は、次の構文を使用します。
INSERT INTO <schema>.<table> [( <column> [, ...] )]
VALUES ( {<expression>} [, ...] )
[, ...] | <query>}次の表で、上記の構文のパラメーターについて説明します。
パラメーター | 説明 |
schema | テーブルが属するスキーマの名前。 |
table | データを挿入するテーブルの名前。 Flink を使用して Hologres にデータを書き込む場合、親テーブルを指定できます。データは自動的にその子テーブルに書き込まれます。Hologres V1.3 以降では、固定実行計画の構文に準拠した INSERT 文を実行して、親テーブルにデータを直接書き込むことができます。詳細については、「固定実行計画による SQL 実行の高速化」をご参照ください。 |
column | データを挿入する列の名前。 列名は、サブフィールド名または配列の添字を付けて指定できます。複合列の一部のフィールドにのみデータを挿入する場合、他のフィールドは NULL になります。 |
expression | 対応する列に割り当てられる式または値。 |
query | 挿入する行を提供する SELECT 文。SELECT 文の構文の詳細については、「SELECT」をご参照ください。 |
INSERT 文は、次のデータ書き込み方法のみをサポートします。
INSERT INTO VALUESINSERT INTO holo2mysqltest (cate_id, cate_name) VALUES (3, 'true'), (3, 'fale'), (3, 'trxxue'), (3, 'x'), (4, 'The Dinner Game');INSERT INTO SELECT :
INSERT INTO test2 SELECT * FROM test1;
仕組み
Hologres テーブルのストレージモードには、行指向ストレージ、列指向ストレージ、行列ハイブリッドストレージがあります。これら 3 つのストレージモードでは、書き込みの原理は同じです。
INSERT 文が実行されると、データは追記専用モードで先行書き込みログ (WAL) に書き込まれ、リアルタイムでメモリテーブルに更新されます。これにより、データは書き込み後すぐにクエリできるようになります。ただし、メモリテーブルのサイズは固定です。メモリテーブルがいっぱいになると、Hologres は別のメモリテーブルに切り替え、バックエンドで非同期フラッシュプロセスをトリガーして、データを徐々にファイルにフラッシュします。ファイルは Pangu ストレージに保存されます。フラッシュプロセス中に、多数の小さなファイルが生成されます。Hologres は、これらの小さなファイルをマージし、バックエンドでソートします。このプロセスはコンパクションと呼ばれます。データ書き込みを高速化するため、Hologres はバックエンドでデータを書き込み、非同期コンパクションが実行されるときにデータを圧縮およびソートします。したがって、データ書き込み中にストレージ使用量が大幅に増加します。データ書き込みとコンパクションが完了すると、ストレージ使用量は減少します。
行指向テーブル、列指向テーブル、および行列ハイブリッドテーブルは、メモリテーブルに対して異なるインデックス形式を使用し、データをファイルにフラッシュするために異なるプロセスを使用します。
行指向テーブル:データは SST 形式の行指向ファイルにフラッシュされます。
列指向テーブル:データは ORC 形式の列指向ファイルにフラッシュされます。
行列ハイブリッドテーブル:データは SST 形式の行指向ファイルと ORC 形式の列指向ファイルにフラッシュされます。フラッシュプロセス中に、データの一貫性が保証されます。データが行指向ファイルと列指向ファイルの両方にフラッシュされた場合にのみ、成功メッセージが返されます。行列ハイブリッドストレージを使用する場合、データは重複して保存されます。これにより、ストレージオーバーヘッドが増加します。
使用制限
パーティションテーブルにデータを挿入する場合、親テーブルではなく子テーブルにデータを挿入してください。挿入するデータのパーティションフィールドの値は、子テーブルのパーティションフィールドの値と同じである必要があります。
列名をリストする順序はカスタマイズできます。
INSERT INTO SELECT文を使用してデータを挿入する場合、必要な列のデータ型がクエリする列のデータ型と一致していることを確認してください。
例
Hologres V2.1.17 以降では、サーバーレスコンピューティングがサポートされています。大規模なオフラインデータインポート、大規模な ETL ジョブ、外部テーブルに対する大量のクエリなどのシナリオでは、サーバーレスコンピューティングを使用してこれらのタスクを実行できます。この機能は、インスタンスリソースの代わりに、追加のサーバーレスリソースを使用するため、インスタンスの安定性が向上し、メモリ不足 (OOM) エラーの可能性が低くなります。インスタンスに追加のコンピューティングリソースを確保する必要はなく、実行したタスクに対してのみ課金されます。サーバーレスコンピューティングの詳細については、「サーバーレスコンピューティング」をご参照ください。サーバーレスコンピューティングの使用方法については、「サーバーレスコンピューティングの使用」をご参照ください。
内部テーブルにデータを挿入します。
CREATE TABLE holotest ( a int, b bigint, c bool, e decimal(38,10), f text, g timestamp, h timestamptz, i jsonb, j int[] ); -- オプション。 大量のデータをオフラインでインポートし、抽出、変換、ロード (ETL) ジョブを実行するには、サーバーレスコンピューティング機能を使用することを推奨します。 SET hg_computing_resource = 'serverless'; -- データをインポートします。 INSERT INTO holotest VALUES (1,9223372036854775807,false,123.123456789123,'john','2020-01-01 01:01:01.123456', '2004-10-19 10:23:54+08','{"a":2}',ARRAY[1, 2, 3, 4]); -- 設定をリセットします。 これにより、後続の SQL 文でサーバーレスコンピューティングリソースが使用されなくなります。 RESET hg_computing_resource;テーブル a のデータをテーブル b に挿入します。
CREATE TABLE holotest2( a int, b bigint, c bool); -- オプション。 大量のデータをオフラインでインポートし、ETL ジョブを実行するには、サーバーレスコンピューティング機能を使用することを推奨します。 SET hg_computing_resource = 'serverless'; -- データをインポートします。 INSERT INTO holotest2 (a,b,c) SELECT a,b,c FROM holotest; -- 設定をリセットします。 これにより、後続の SQL 文でサーバーレスコンピューティングリソースが使用されなくなります。 RESET hg_computing_resource;パーティションテーブルにデータを挿入します。
-- public スキーマに、プライマリキーのない親テーブルとその子テーブルを作成します。 BEGIN; CREATE TABLE public.hologres_parent( a text, b int, c timestamp, d text ) PARTITION BY list(a); CALL set_table_property('public.hologres_parent', 'orientation', 'column'); CREATE TABLE public.hologres_2022 partition of public.hologres_parent for values in('2022'); CREATE TABLE public.hologres_2021 partition of public.hologres_parent for values in('2021'); CREATE TABLE public.hologres_2020 partition of public.hologres_parent for values in('2020'); COMMIT; -- オプション。 大量のデータをオフラインでインポートし、ETL ジョブを実行するには、サーバーレスコンピューティング機能を使用することを推奨します。 SET hg_computing_resource = 'serverless'; -- 子テーブルにデータを挿入します。 INSERT INTO public.hologres_2022 values('2022',1,now(),'a') -- 設定をリセットします。 これにより、後続の SQL 文でサーバーレスコンピューティングリソースが使用されなくなります。 RESET hg_computing_resource;
よくある質問
質問 1:大量のデータを書き込むと、インスタンスの CPU 使用率とメモリ使用量が 100% になります。これにより、インスタンスでのデータ書き込みとクエリに悪影響が出ます。どうすればよいですか?
大量のデータを書き込む場合は、サーバーレスコンピューティング機能を使用することを推奨します。
説明Hologres V2.1.17 以降は、サーバーレスコンピューティング機能をサポートしています。サーバーレスコンピューティング機能は、大量のデータをオフラインでインポートしたり、大規模な ETL ジョブを実行したり、外部テーブルを使用して大量のデータをクエリしたりするシナリオに適しています。インスタンスの予約済みリソースではなく、サーバーレスコンピューティングリソースを使用して、上記の操作を実行できます。予約済みのコンピューティングリソースは必要ありません。これにより、インスタンスの安定性が向上し、メモリ不足 (OOM) エラーの発生が減少します。タスクで使用されるサーバーレスコンピューティングリソースに対してのみ課金されます。サーバーレスコンピューティング機能の詳細については、「サーバーレスコンピューティング」をご参照ください。サーバーレスコンピューティング機能の使用方法の詳細については、「サーバーレスコンピューティングの使用」をご参照ください。
質問 2:データを書き込むとストレージ使用量のメトリックが大幅に増加し、データの書き込み後に減少するのはなぜですか?
データ書き込みの原理に基づき、データ書き込みを高速化するために、Hologres はバックエンドでデータを書き込み、非同期コンパクションが実行されるときにデータを圧縮およびソートします。したがって、データ書き込み中にストレージ使用量が大幅に増加します。データ書き込みとコンパクションが完了すると、ストレージ使用量は減少します。
質問 3:同じテーブルで複数の
INSERT文を並列に実行すると、レイテンシーが増加するのはなぜですか?固定実行計画を使用せずにテーブルで
INSERT文を実行すると、テーブルがロックされます。INSERT文を並列実行すると、ロック待ち時間が増加し、結果としてレイテンシーが増加します。質問 4:親テーブルにデータを書き込むときに、エラーメッセージ
ERROR: no partition of relation "<table_name>" found for rowが返されるのはなぜですか?問題の説明:エラーメッセージ
ERROR: no partition of relation "<table_name>" found for rowが返されます。原因:子テーブルが存在しません。
解決策:データを書き込む前に、次の文を実行して子テーブルを作成してください。
CREATE TABLE <child_table_name> partition of <parent_table_name> for values in (<value>);
質問 5:データをインポートするときに、エラーメッセージ
Currently inserting into parent table is not supportedが返されるのはなぜですか?問題の説明:データをインポートするときに、エラーメッセージ
Currently inserting into parent table is not supportedが返されます。原因:データを挿入しようとしているテーブルが親テーブルです。Hologres では、親テーブルへのデータ書き込みは許可されていません。
解決策:子テーブルを作成し、その子テーブルにデータを書き込んでください。