このトピックでは、ApsaraDB for ClickHouseのテーブルにデータを挿入するために使用されるINSERT INTOステートメントの構文について説明します。
構文
次のコードは、INSERT INTOステートメントの構文を示しています。
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...テーブルスキーマで定義されているが、INSERT INTOステートメントで指定されていないフィールドの場合、システムは次の規則に基づいてフィールドに入力します。
フィールドのデフォルト値に対して式が定義されている場合、システムはこの式を使用してデフォルト値を計算し、そのデフォルト値をフィールドに挿入します。
フィールドのデフォルト値に式が定義されていない場合、0または空の文字列がフィールドに挿入されます。
INSERT INTOステートメントでSELECT句を使用する
次のコードは、構文を示しています。
INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...SELECT句で照会されるフィールドのデータは、INSERT intoステートメントで指定されたフィールドに厳密な順序で挿入されます。 2つのフィールドセットの名前は同じである必要はありません。 システムは必要に応じてフィールドのデータ型を変換します。
VALUES型を除いて、他のすべてのデータ型はnow() や1 + 2などの式をサポートしていません。 VALUES型では、このような式を使用できます。 ただし、これらの式の実行は非効率的であるため、これらの式を使用しないことをお勧めします。
INSERT INTOステートメントの高性能を確保するための提案
システムがINSERT INTO文を実行すると、挿入するデータが処理されます。 例えば、システムは、一次キーによってデータをソートしたり、月ごとにデータを分割したりする。 挿入されるデータが複数か月に及ぶ場合、INSERT INTOステートメントのパフォーマンスが大幅に低下します。 この問題を防ぐために、次の対策を講じることができます。
常に大量のデータを一度に書き込む。 たとえば、毎回100,000行のデータを書き込むことができます。
ApsaraDB for ClickHouseクラスターにデータを書き込む前に、データをグループ化します。
次のシナリオでは、INSERT INTOステートメントのパフォーマンスは影響を受けません。
データは常にリアルタイムで書き込まれます。
書き込まれるデータは、既に時間によってソートされている。