INSERT ステートメントを実行して、特定のテーブルに新しい行を挿入できます。このトピックでは、Hologres で INSERT ステートメントを使用する方法について説明します。
構文
Hologres のテーブルに、値式で指定された 1 つ以上の行、またはクエリから生成された 0 個以上の行を挿入できます。INSERT ステートメントは、次の構文を使用します。
INSERT INTO <schema>.<table> [( <column> [, ...] )]
VALUES ( {<expression>} [, ...] )
[, ...] | <query>}次の表は、INSERT ステートメントのパラメーターについて説明しています。
パラメーター | 説明 |
schema | テーブルが存在するスキーマの名前。 |
table | データを挿入するテーブルの名前。 Realtime Compute for Apache Flink を使用して Hologres にデータを書き込む場合、親テーブルを指定できます。データは自動的に子テーブルに書き込まれます。Hologres V1.3 以降では、固定プランを使用するための構文に準拠した INSERT ステートメントを実行して、親テーブルに直接データを書き込むことができます。詳細については、「固定プランを使用した SQL ステートメントの実行の高速化」をご参照ください。 |
column | データを挿入する列の名前。 列の名前は、サブフィールド名または配列の添え字を使用して修飾できます。複合列の一部のフィールドにのみデータを挿入する場合、他のフィールドは NULL のままになります。 |
expression | 対応する列に割り当てられる式または値。 |
query | 挿入する行を提供する SELECT ステートメント。SELECT ステートメントの構文の詳細については、「SELECT」をご参照ください。 |
INSERT ステートメントは、次のデータ書き込み方式のみをサポートしています。
insert into values:INSERT 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 ステートメントが実行されると、Append Only モードで Write-Ahead Logging(WAL)にデータが書き込まれ、メモリテーブルのデータがリアルタイムで更新されます。これにより、データがリアルタイムで表示されるようになります。ただし、メモリテーブルのサイズは固定されています。メモリテーブルがいっぱいになると、Hologres は新しいメモリテーブルに切り替え、バックエンドで非同期フラッシュプロセスをトリガーして、データをファイルに徐々にフラッシュします。ファイルは Pangu に保存されます。フラッシュプロセス中に、多数の小さなファイルが生成されます。Hologres は、これらの小さなファイルをマージして、バックエンドでソートします。このプロセスはコンパクションと呼ばれます。データ書き込みプロセスを高速化するために、Hologres はバックエンドでデータを書き込み、非同期コンパクションの実行時にデータを圧縮およびソートします。そのため、データ書き込みプロセス中にストレージ使用量が大幅に増加します。データ書き込みプロセスとコンパクションプロセスが完了すると、ストレージ使用量は減少します。
行指向テーブル、列指向テーブル、および行列ハイブリッドテーブルは、メモリ内のメモリテーブルに異なるインデックス形式を使用し、異なるプロセスを使用してデータをファイルにフラッシュします。
行指向テーブル:データは SST 形式で行指向ファイルにフラッシュされます。
列指向テーブル:データは ORC 形式で列指向ファイルにフラッシュされます。
行列ハイブリッドテーブル:データは SST 形式で行指向ファイルに、ORC 形式で列指向ファイルにフラッシュされます。フラッシュプロセス中に、データの整合性が確保されます。データが行指向ファイルと列指向ファイルの両方にフラッシュされた場合にのみ、成功メッセージが返されます。行列ハイブリッドストレージを使用する場合、データは重複して保存されます。これにより、ストレージのオーバーヘッドが増加します。
制限事項
親テーブルにデータを挿入する場合は、データが親テーブルの子テーブルに挿入されていることを確認してください。挿入されるデータのパーティションフィールドの値は、子テーブルのパーティションフィールド値と同じである必要があります。
列名の表示順序をカスタマイズできます。
insert into selectメソッドを使用してデータを挿入する場合は、必要な列のデータ型がクエリ対象の列のデータ型と一致していることを確認してください。
例
内部テーブルにデータを挿入します。
CREATE TABLE holotest ( a int, b bigint, c bool, e decimal(38,10), f text, g timestamp, h timestamptz, i jsonb, j int[] ); 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]);テーブル a のデータをテーブル b に挿入します。
CREATE TABLE holotest2( a int, b bigint, c bool); INSERT INTO holotest2 (a,b,c) SELECT a,b,c FROM holotest;パーティションテーブルにデータを挿入します。
-- 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; -- 子テーブルにデータを挿入します。 INSERT INTO public.hologres_2022 values('2022',1,now(),'a')
FAQ
質問 1:データを書き込むときに監視メトリックのストレージ使用量が大幅に増加しますが、データが書き込まれた後に減少するのはなぜですか?
データ書き込み原則に基づいて、データ書き込みプロセスを高速化するために、Hologres はバックエンドでデータを書き込み、非同期コンパクションの実行時にデータを圧縮およびソートします。そのため、データ書き込みプロセス中にストレージ使用量が大幅に増加します。データ書き込みプロセスとコンパクションプロセスが完了すると、ストレージ使用量は減少します。
質問 2:同じテーブルで複数の
INSERTステートメントを並列実行すると、レイテンシが増加するのはなぜですか?固定プランを使用せずにテーブルで
INSERTステートメントを実行すると、テーブルがロックされます。INSERTステートメントの並列実行により、ロックの待機時間が長くなり、レイテンシが増加します。質問 3:データを親テーブルに書き込むときに、エラーメッセージ
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>);
質問 4:データをインポートするときに、エラーメッセージ
Currently inserting into parent table is not supportedが返されるのはなぜですか?問題の説明:データをインポートするときに、エラーメッセージ
Currently inserting into parent table is not supportedが返されます。原因:データを挿入しようとしているテーブルは親テーブルです。Hologres では、親テーブルへのデータ書き込みはサポートされていません。
解決策:子テーブルを作成して、子テーブルにデータを書き込みます。