「Snowflake の Insert Into」を使って、Snowflake のテーブルに効率的にデータを追加する方法を見ていきましょう。このガイドでは、重要な構文、わかりやすい例、データ挿入を強化するための実践的なヒントについてお話します。単一行であれ複数行であれ、構造化データであれ JSON データであれ、自信を持って「Insert Into」の操作を実行するための知識が得られます。

主なポイント

  • Snowflake の INSERT INTO コマンドは、テーブルへのデータの入力に不可欠であり、ターゲットテーブルと値を含むコマンド構文で単一行または複数行の挿入に対応している。
  • Snowflake は VARIANT データ型を通じて JSON データに対応し、PARSE_JSON 関数を使って JSON フォーマットの文字列を VARIANT カラムに挿入し、ストレージとクエリのパフォーマンスを最適化する。
  • Snowflake では、複数行の挿入を使ってネットワークのレイテンシ(遅延)とトランザクションのオーバーヘッドを削減し、Snowpipe を使ってクラウド ストレージから大量のデータを効率的かつ自動で取り込むことで、パフォーマンスを最適化できる。

目次

Snowflake の INSERT INTO コマンドの基礎知識

Snowflake のデータ管理の領域では、INSERT INTO のコマンドをマスターするのは、小説を書く前にアルファベットを学ぶのと同じくらい基本的なことです。このコマンドはテーブルの行にデータを入力するのに使われ、1つ以上の行を追加することで効果的にテーブルを更新します。そして INSERT INTO コマンドの構文では、ターゲットテーブルを指定し、リテラル値、DEFAULT キーワード、または NULL などの挿入する値を確定します。

Snowflake の INSERT INTO コマンドは、Snowflake のデータベース内の多数の操作を解除するマスターキーと考えてください。 これはテーブルにデータを挿入するために使えるだけでなく、挿入されたデータの構造と順序を定義するのにも使えることから、データエンジニアのツールボックスに欠かせないツールになります。 基本を説明したので、このコマンドの構文とパラメーターをさらに深く掘り下げてみましょう。

構文とパラメータ

INSERT INTO コマンドを使いこなすには、その基本構文を理解することから始めましょう。コマンドは、行を挿入するターゲットテーブルを指定することから始まり、オプションでターゲットカラムのリストを指定し、挿入するデータをVALUES 句で指定します。これは単純に見えるかもしれませんが、見た目以上に多くのことができます。例えば、INSERT 文に列名を含めることで、どの列にデータを挿入するかを指定することができ、これは、値を目的のカラムに一致させたり、カラムの順序に依存しないようにするのに非常に便利です。

Snowflake のテーブルに複数の行を挿入したい時が出てくる場合があるかもしれませんが、そのような場合、VALUES 句には対応する値の複数のセットを含めることができ、各セットは括弧で囲まれ、カンマで区切られます。ただし、1回の INSERT コマンドでは最大16,384行までという制限があり、対象となる列の数は各セットの値の数と一致しなければならないことに注意が必要です。そしてこの知識を活用して、データ型と列のマッチングの複雑さを調べることができます。

データ型と列の一致

よくまとめられた交響曲のように、Snowflake テーブルの個々のコンポーネントは特定の役割を果たします。INSERT INTO 文の各列のデータ型と値を一致させるのは、型エラーを防ぎ、データの整合性を維持するのに非常に重要です。また、複数行の挿入では、最初の行のデータ型がテンプレートとして機能し、挿入を成功させるためにすべての行で一貫したデータ型が要求されます。つまり、複数行の挿入では、たとえ列のデータ型が理論上正しい型に値を強制できたとしても、行全体でデータ型が一貫していないとエラーになるということです。

JSON のような半構造化データに関しては、さらに考慮すべき点があります。文字列や数値のようなネイティブの JSON 型は、VARIANT 列のストレージとクエリのパフォーマンスで効率的に処理されますが、日付やタイムスタンプのような非ネイティブデータ型は、同等のリレーショナルデータ型として格納されない場合だと、効率が悪くなり、より多くのスペースを消費する可能性があります。

基本的なことは押さえたので、次は INSERT INTO コマンドの実用的な応用に焦点を移しましょう。

Snowflake のテーブルにおける単一行および複数行の挿入

テーブルにデータを挿入する際には、Snowflakeの柔軟性が際立ちます。Snowflake は単一の行でも複数の行でも対応できることから、このプラットフォームでは、INSERT INTO コマンドを使って、単一行と複数行の両方をテーブルに挿入することができます。また、Snowflake テーブルに複数の行を挿入するには、VALUES 句を拡張して、それぞれが個別の行を表す複数の値のセットを含めます。これによって、様々な値のセットを括弧で囲み、1つの INSERT 文の中でカンマで区切ることで、複数行を挿入することができます。

複数行を同時に挿入できるこの機能は、データエンジニアにとって画期的なものであり、それによってデータ挿入操作を最適化して貴重な時間を節約する術が得られます。では、単一行の挿入と複数行の挿入の両方について詳しく見ていきましょう。

単一行の挿入

Snowflake のテーブルに単一の行を挿入する場合、そのプロセスは簡単です。INSERT INTO 文と VALUES 句を使って、対応する列の値を指定します。単一の行を挿入する構文は以下の通りです:

  • INSERT INTO ステートメント
  • テーブル名
  • 場合によっては列名
  • 挿入する値をかっこで囲んだ VALUES 句。

例えば、カラム(cid, customer_name, mobile, city, ordername)を持つ 'customer' のテーブルを作成し、そこに行を挿入したい場合は以下のように INSERT INTO コマンドを使います: INSERT INTO customer (cid, customer_name, mobile, city, ordername) VALUES (1, 'Joker', 90990909, 'Washington', 'colors');. このコマンドは1回の操作でテーブルに新しい顧客が追加されることから、それで INSERT INTOコマンドのシンプルさと有効性がわかります。

複数行の挿入

Snowflake のINSERT INTO コマンドの威力は、複数行を挿入するときに真価を発揮します。VALUES句 を拡張して、括弧とカンマで区切られた複数の値のセットを含めることができますが、VALUES句 には1つの INSERT INTO 文で16,384行という制限があることを頭に入れておかないといけません。ちなみに、この制限を超えるデータロードに対しては、COPY INTO コマンドを使うといいでしょう。

また、SELECT文 を使って、テーブルに複数行を挿入することもできます。その場合、必要な値を指定することで、1つ以上のソーステーブルからの挿入がしやすくなります。例えば、複数行の挿入の例として、INSERT INTO customer (cid, customer_name, mobile, city, ordername) VALUES (2, 'Thomas Shelby', 8797899999, 'Chicago', 'Gun'), (3, 'Arthur Shelby', 7657575657, 'Austin', 'Shotgun'), (4, 'John Shelby', 77868768, 'Chicago', 'Table') という文があり、この方法によって、効率的にサッと行を挿入することができます。

これで、INSERT INTO コマンドが Snowflake でデータを管理および操作するための強力なツールであることがわかりますね。

SnowflakeでJSONデータを扱う

ビッグデータの領域では、JSON が半構造化データの一般的なフォーマットとして出てきており、Snowflake はこれを見事に処理してくれます。Snowflake の VARIANT データ型は、JSON などの半構造化データ形式を格納するように設計されており、JSONのような半構造化データは、VARIABLE カラムを使って Snowflake のテーブルに挿入することができます。そして 文字列を VARIANT 型に変換して、この形式に対応する列に JSON データを挿入できるようにするには、Snowflake は PARSE_JSON 関数を使用します。

JSON データを扱うこの機能は、最新のデータ形式を扱う上で大きな利点となり、それによってデータ管理の柔軟性と効率性が上がります。では、Snowflakeが JSON 値の挿入をどのように処理し、VARIANT カラムをどのように管理するのかをさらに見てみましょう。

JASON 値の挿入

Snowflake の JSON カラムに JSON値 を挿入する場合、そのプロセスには追加のステップがいくつか必要です。JSON値は、VALUES句 内で単一の引用符で囲む必要があり、JSON形式の文字列を Snowflake の VARIANT データ型カラムに適した形式に変換するには、PARSE_JSON 関数を使用します。

例えば、Snowflake のテーブルに JSON データを挿入したい場合、以下のように PARSE_JSON関数を使った INSERT INTO のコマンドを使います: INSERT INTO json_table (json_column) VALUES (PARSE_JSON('{"key": "value"}'));. このコマンドで、Snowflake の JSON データの強固なハンドリングが、データエンジニアに強力なツールを提供することがわかります。

VARIANT カラムの取り扱い

Snowflake の VARIANT カラムは汎用性が高く、データの階層構造を明示的に記述することなく、以下のようなデータ型のカラムをすべて含むさまざまなデータ形式を直接格納することができます:

  • JSON
  • Avro
  • ORC
  • Parquet

また、Snowflake の VARIANT データ型は、OBJECT や ARRAYなどの他の任意の型の値を、最大16MBの非圧縮データサイズまで格納することができます。

Snowflake は、有効な JSON を含む文字列を VARIANT型 に変換するのに  PARSE_JSON 関数を使い、それによって、JSON オブジェクトを VARIANTカラムに格納することができます。また、入力文字列が「null」の場合、JSON null 値として解釈され、SQL NULL ではなく、null を含む VARIANT 値が生成されることに注意しましょう。

こういった微妙な違いの理解は、Snowflake で JSON データを扱う際に非常に重要です。

Snowflake の INSERT INTO コマンドにおける OVERWRITE句 の活用

Snowflake でデータ管理をマスターするための次のポイントは、INSERT INTOコマンドの OVERWRITE句 の役割を理解することです。この句は、テーブル内の既存のデータを置き換えるために使用され、OVERWRITE句 が使われると、新しいレコードを挿入する前にターゲットテーブルを切り捨てるよう Snowflake に通知が行き、それによって効果的に以前のデータがすべてクリアになります。この機能は、重複エントリやデータの競合を防ぎながら、新しいデータでテーブルをリフレッシュするようなシナリオで特に便利です。

また、OVERWRITEオプションを使っても、ターゲットテーブルの既存のアクセス制御権限は変更されないため、権限が変わらないことが保証されます。このパワーと柔軟性の組み合わせにより、OVERWRITE句 はデータ管理ツールキットの中で強力なツールへと変貌を遂げます。

OVERWRITE句 の役割

OVERWRITE句 は、Snowflake のデータ管理において極めて重要な役割を果たし、INSERT INTO のコマンドと一緒に使うと、既存のテーブルデータは新しく挿入された行に置き換えられます。これは、新しい値を挿入する前にターゲットテーブルを切り捨て、効果的に既存のデータをすべて削除することで実現されます。

OVERWRITE パラメータを使ってもターゲットテーブルのアクセス制御権限に影響しないため、権限がそのまま維持されるのは心強い点であり、これによって、OVERWRITE句 はデータ管理の強力なツールとなり、セキュリティを確保しながら制御と柔軟性を提供します。

OVERWRITE句 のオプションとユースケース

Snowflake の INSERT INTO コマンドの OVERWRITE 句は単なるオプションではなく、多くのユースケースがある汎用性の高いツールです。例えば、指定がない場合に、Snowflake は挿入操作の前にターゲットテーブルを切り捨てることはせず、OVERWRITE句 がある挿入文が処理されると、それは現在のトランザクションの範囲内で実行されます。これにより、DDL 文がトランザクションをコミットする必要がなくなります。

さらに、OVERWRITE オプションを SELECT 文と組み合わせることで、切り捨て後のクエリの結果をターゲットテーブルに挿入することができます。OVERWRITE句 のユースケースは、別のテーブルから更新されたデータでテーブルを再構築し、古いデータを効果的に置き換えることです。

このようなオプションとユースケースを理解することで、OVERWRITE句 の力を効果的に活用することができるのです。

Snowflake における INSERT INTO のユースケース

コマンドの真の威力は、実際に使用することで発揮されます。ここでは、Snowflakeで INSERT INTO コマンドを使う実践的な例を見ていきましょう。その例では、コマンドの多用途性、様々なシナリオでの使用方法、効率化のための最適化方法を紹介します。例えば MicroStrategy の ODBC(Open Database Connectivity) 設定で「PARAM_QUERY_ROWSET_SIZE」などのパラメータを調整 すると、一括挿入操作のパフォーマンスが上がります。

社内テストでは、'PARAM_QUERY_ROWSET_SIZE' を 1 MB などの大きな値に設定すると、一括挿入時のパフォーマンスがより大幅によくなることが確認されています。また、MicroStrategy の Snowflake でこのパラメータを効果的に調整するには、ODBCConfig.ini ファイルの下に設定を追加し、MicroStrategy I-Server を再起動して変更を適用します。それでは、INSERT INTO コマンドの具体的なユースケースをいくつか見てみましょう。

複数のテーブルにデータを挿入する

INSERT INTO コマンドが際立つ実用的なシナリオの1つに、複数のテーブルへのデータの挿入があります。Snowflake は、複数のテーブルを更新し、クエリから得られた値で行を挿入することで、複数テーブルの挿入に対応します。そしてそれは、1つの INSERT文 で複数の INTO句 を指定することで実現されます。

無条件の複数テーブル挿入は、'INSERT ALL'構文で行うことができ、INSERT文 の INTO句 すべてにサブクエリの各行が適用されます。一方、条件付き複数テーブル挿入では、特定の 'WHEN' 条件に基づいて行をさまざまなテーブルに導くことができ、この柔軟性により、複数のテーブルにまたがるデータを効率的に管理することができます。

サブクエリと CTE (共通テーブル式)の操作

サブクエリと CTE(共通テーブル式)を使用すると、結合、集計、変換などの複雑なソースまたは派生ソースからデータを Snowflake テーブルに挿入でき、それによって、データを格納するための強力かつ柔軟な方法が得られます。 また、CTE、特に再帰的な CTE では、INSERT INTO コマンド内で簡単に参照できる一時的な結果セットの作成ができるようになるため、モジュール性が上がり、メンテナンスがシンプルになります。

再帰 CTE は階層データを効率的に表現するために使用され、それによって、各階層レベルは順番に処理されます。また、再帰 CTE の結果セットは INSERT INTO コマンドで直接使用できるため、階層データを含む構造化データの格納がしやすくなります。

一方、サブクエリは、ターゲットテーブルの値のソースを指定する手段を提供し、それによって複雑なソースクエリに基づく動的なデータ挿入が保証されます。

パフォーマンスの最適化とベストプラクティス

Snowflake で INSERT INTO コマンドを使う際の複雑さをここで押さえたので、次はパフォーマンスの最適化とベストプラクティスに焦点を移しましょう。複数行の挿入を使うことで、Snowflake のネットワークラウンドトリップとトランザクションオーバーヘッドが削減され、それによってデータ挿入のスピードが上がります。また、Snowflake にデータを挿入する際には、効率を最大化するためのベストプラクティスに従うことが不可欠であり、このようなプラクティスを遵守することで、全体的なパフォーマンスが大幅に改善されます。

大量のデータを格納する場合は、手動で INSERT コマンドを実行するよりも効率的な、クラウドストレージからの自動インジェストを行う Snowpipe がオススメです。では、その戦略についてさらに深掘りしてみましょう。

性能向上のための多列挿入

Snowflake における複数行の挿入は、ネットワークのラウンドトリップとトランザクションに関連するオーバーヘッドを最小限に抑えることで、パフォーマンスを大幅に上げてくれます。また、Snowflake への複数行の挿入のパフォーマンスとセキュリティは、パラメータ化されたクエリで準備されたステートメントを使うことにより、さらに改善されます。

複数行の挿入操作をエラーなく正常に実行するには、挿入される値すべてに各行で一貫したデータ型がないといけませんが、Snowflake では、1回の操作で挿入できる行数に制限を設けていないため、数百万行や数十億行といった大量の行を挿入することができます。

大容量データに Snowpipe を活用

大量のデータの格納を処理するには、 Snowpipe は Snowflake にある優れたツールであり、クラウドストレージからの自動取り込みができるようになり、手動で INSERT コマンドを実行するよりも効率的になります。また、Snowpipe は、クラウドストレージサービスからのイベント通知を活用することで、自動のデータ格納に対応しています。そしてイベント通知で、格納する新しいデータファイルの到着が Snowpipe に通知されます。

Snowpipe はデータの格納に Snowflake が提供するコンピュートリソースを使うため、プロセス中にユーザーが指定したウェアハウスを使う必要がありません。また、Snowpipe のデータファイルは、パイプオブジェクトごとに単一のシーケンスでキューに入れられ、通常はステージングされた順番に読み込まれますが、複数のプロセスがキューからファイルを引き出すため、正確な格納の順序は保証されません。

まとめ および Integrate.io ができること

INSERT INTO コマンドを使いこなせば、Snowflake でのデータ管理は簡単になります。基本的な構文の理解から、単一行および複数行の挿入、JSON データの処理、OVERWRITE句 の活用、実践的な例の適用まで、このコマンドはデータエンジニアリングの強力なツールです。さらに、ベストプラクティスを遵守し、複数行挿入や Snowpipe などの戦略を使うことで、データ挿入の操作が最適化され、データ管理タスクがより効率的かつ効果的に行われます。

データエンジニアとしての使命は、組織の価値を生み出すためのデータの管理および操作であり、Snowflake の INSERT INTO コマンドのようなツールを使いこなすことは、このミッションに不可欠です。本記事で提供された知識とインサイトにより、INSERT INTO コマンドのパワーを活用してデータ管理スキルを新たな高みへと引き上げるための十分な準備が整いましたね。

Snowflake でのデータ管理を新たな高みへと引き上げる準備はできましたか?Integrate.ioには、 データワークフローを効率化および最適化するために設計された、パワフルで使いやすいプラットフォームがあります。また、構造化データと JSON データのシームレスな統合から、効率的なバッチ処理、リアルタイムのデータ取り込みまで、データ挿入タスクをよりシンプルかつ効果的にするのに必要なツールとサポートを提供します。Integrate.io の強固なデータ統合機能でデータの可能性を最大限に引き出し、Snowflake でのデータ管理をマスターするための第一歩を踏み出しましょう。 Integrate.io でデータ戦略がどのように変革できるか、ぜひこちらからお問い合わせください。

Q&A

Q. Snowflake テーブルに手動でデータを挿入する方法は?

A. テーブルのカラムと同じ順序で各カラムの値を指定することで、例えば、"INSERT INTO "コマンドの後に挿入する値を指定するなど、Snowflake テーブルに手動でデータを挿入することができます。。

Q. Snowflake の insert関数とは何ですか?

A. Snowflake の INSERTコマンドは、テーブルにデータを追加する主な方法であり、これは、挿入対象のテーブルと挿入する値を指定するもので、特に小規模なデータ挿入タスクに便利な簡単な構文です。

Q. Snowflake はビューに挿入できますか?

A. はい、Snowflake のビューに INSERT INTO コマンドを使ってデータを挿入し、テーブルに 1 行以上のデータを追加することができます。Snowflake にはそのような機能があります。(日付は含まれていません)。

Q. Snowflake のテーブルに複数行を挿入するには?

A. Snowflake のテーブルに複数行を挿入するには、単に VALUES句 を拡張して、括弧で囲んでカンマで区切った複数の値のセットを含めます。これは1つの INSERT文 の中で行わなければならないことに注意してください。

Q. Snowflake は JSON データをどのように扱うのですか?

A. Snowflake は VARIANT データ型と PARSE_JSON 関数を使って JSON データを処理し、JSON 形式の文字列を Snowflake の VARIANT データ型カラムと互換性のある形式に変換します。これにより、JSON データの効率的な保存とクエリが実現します。