|iceberg-tm|テーブルのSnowflakeストレージ

Snowflakeは、|iceberg-tm|テーブルのSnowflakeストレージをサポートしています。

標準のSnowflakeテーブルと同様に、この機能によりSnowflakeで:ref:`Snowflakeが管理するIcebergテーブル<label-tables_iceberg_snowflake_as_catalog>`を作成できます。このオプションを使用すると、SnowflakeはSnowflake(内部)ストレージを使用してIcebergテーブルファイルを保存および管理するため、ユーザーが外部クラウドストレージへのアクセスを設定する必要はありません。

この機能は:doc:Snowflake Horizonカタログ</user-guide/snowflake-horizon>`と連携するため、外部クエリエンジンを使用して、Snowflakeストレージを使用するIcebergテーブルに接続することができます。詳細については、 :doc:/user-guide/tables-iceberg-access-using-external-query-engine-snowflake-horizon` をご参照ください。さらに、Snowflakeではこれらの同じテーブルをクエリできます。

注釈

この機能は現在、Amazon Web Services(AWS)またはAzureでホストされているアカウントでのみ使用できます。この機能は、政府リージョンまたは中華人民共和国ではご利用いただけません。

Snowflakeストレージの仕組み

SnowflakeストレージでIcebergテーブルを作成すると、Snowflakeはすべてのデータとメタデータファイルを内部で管理します。外部ボリュームを構成したり、クラウドストレージへのアクセス権をSnowflakeに付与したりする必要はありません。

SnowflakeストレージでIcebergテーブルを作成する

CREATE ICEBERG TABLE my_iceberg_table_defaults (col1 int)
  CATALOG = SNOWFLAKE
  EXTERNAL_VOLUME = SNOWFLAKE_MANAGED;

Snowflakeが管理するストレージを使用した明示的:code:`TRANSIENT`テーブル:

CREATE TRANSIENT ICEBERG TABLE my_iceberg_table_internal (col1 int)
  CATALOG = SNOWFLAKE
  EXTERNAL_VOLUME = SNOWFLAKE_MANAGED;
  • :code:`CATALOG`は、このストレージモデルの:code:`SNOWFLAKE`であることが必要です。アカウントのデフォルトカタログがSnowflakeである場合は、:code:`CATALOG`を省略できます。

  • Snowflakeストレージを使用している場合は、:code:`EXTERNAL_VOLUME`が:code:`SNOWFLAKE_MANAGED`であることが必要です。デフォルトの外部ボリュームが:code:`SNOWFLAKE_MANAGED`である場合は、:code:`EXTERNAL_VOLUME`を省略できます。

:code:`SNOWFLAKE_MANAGED`外部ボリューム

:code:`EXTERNAL_VOLUME = 'SNOWFLAKE_MANAGED'`はSnowflakeに用意されているテーブル用のストレージを選択します。:code:`SNOWFLAKE_MANAGED`は予約済みの値であり、ユーザーが作成した:doc:`外部ボリューム</sql-reference/sql/create-external-volume>`オブジェクトではありません。このパスに対して:code:`CREATE EXTERNAL VOLUME`は実行しません。

代わりに**ご使用の**クラウドストレージにファイルを保存するIcebergテーブルに対して、外部ボリュームを作成し、USAGE`を付与して、:code:`EXTERNAL_VOLUME`をそのボリュームの名前に設定します。手順については、 :doc:/user-guide/tables-iceberg-configure-external-volume` をご参照ください。

永続テーブルおよび一時テーブル

Snowflakeストレージを使用するIcebergテーブルは、永続テーブルまたは一時テーブルのいずれかとして設定できます。

  • **永続的**(デフォルト):テーブルデータは、標準テーブルに対してSnowflakeに用意されているのと同じ7日間のデータ復旧機能である:doc:`Fail-safe</user-guide/data-failsafe>`によって保護されます。

  • 一時的:テーブルデータはFail-safeで保護されません。ストレージとTime Travelの動作は、Snowflakeの:ref:`一時テーブル<label-table_type_transient>`に記載されているとおりです。一時テーブルにはFail-safeストレージコストは発生しません。

:doc:`CREATE ICEBERG TABLE </sql-reference/sql/create-iceberg-table-snowflake>`ステートメントの:code:`TRANSIENT`キーワードを使用して、一時的なIcebergテーブルを作成します。

注釈

一時的なIcebergテーブルはSnowflakeストレージでのみサポートされます。お客様管理の外部ボリュームを使用する一時的なIcebergテーブルを作成することはできません。

Tip

既存のIcebergテーブルが永続テーブルであるか一時テーブルであるかを確認するには、:doc:`SHOW TABLES </sql-reference/sql/show-tables>`を実行して``kind``列を確認します。値は一時テーブルの場合は``TRANSIENT``であり、永続テーブルの場合は``TABLE``です。

デフォルトカタログと外部ボリューム

ステートメントで:code:CATALOG`および:code:`EXTERNAL_VOLUME`を省略した場合、Snowflakeはスキーマ、データベース、およびアカウントのデフォルトからそれらを解決します(スキーマはデータベースをオーバーライドし、データベースはアカウントをオーバーライドします)。有効なカタログがSnowflakeである(:code:`CATALOG = 'SNOWFLAKE')場合、下位レベルで別のデフォルトが設定されていない限り、デフォルトの外部ボリュームは:code:SNOWFLAKE_MANAGED`です。 パラメーターで指定。詳細については、 :ref:`label-tables_iceberg_configure_catalog_set_level および アカウント、データベース、またはスキーマレベルでデフォルトの外部ボリュームを設定する をご参照ください。

:code:`CATALOG = 'SNOWFLAKE'`を明示的に設定した場合、:code:`EXTERNAL_VOLUME`または別のボリュームを指定するスキーマ、データベース、またはアカウントのデフォルトでオーバーライドしない限り、デフォルトの外部ボリュームは:code:`SNOWFLAKE_MANAGED`です。

複製

フェールオーバーまたは複製グループを使用することで、Snowflakeストレージを使用するIcebergテーブルを複製できます。これらのテーブルの複製を有効にするには、まず:doc:`/user-guide/tables-iceberg-replication`のステップに従って、Snowflakeが管理するIcebergテーブルの複製を有効にする必要があります。

Snowflakeが管理する標準的なIcebergテーブルとは異なり、フェールオーバーグループまたは複製グループの:code:`OBJECT_TYPES`リストに:code:`EXTERNAL VOLUMES`を配置する必要はありません。Snowflakeは、:code:`SNOWFLAKE_MANAGED`外部ボリュームを使用する複製されたテーブルのストレージを自動的に管理します。

たとえば、Snowflakeストレージを使用するIcebergテーブルが含まれるデータベースを複製するフェールオーバーグループを作成します。

CREATE FAILOVER GROUP my_iceberg_fg
  OBJECT_TYPES = DATABASES
  ALLOWED_DATABASES = my_iceberg_database
  ALLOWED_ACCOUNTS = myorg.my_account_1;

複製に関する考慮事項

  • Google Cloud Platform(GCP)でホストされているアカウントへの複製はサポートされていません。ターゲットアカウントがGCPでホストされている場合、Snowflakeはリフレッシュ操作中にSnowflakeストレージを使用するIcebergテーブルをスキップします

  • プライベートプレビュー中にユーザーが:code:`SNOWFLAKE_MANAGED`以外の外部ボリュームを使用してIcebergテーブルを作成した場合、Snowflakeはセカンダリアカウントの複製されたテーブルを自動的に移行して、:code:`SNOWFLAKE_MANAGED`ボリュームを使用します。この移行については、次の点に注意してください。

    • フェールオーバーグループまたは複製グループの:code:`OBJECT_TYPES`リストに:code:`EXTERNAL VOLUMES`を配置すると、プライベートプレビューの外部ボリュームはセカンダリアカウントに複製されますが、テーブルにはアタッチされません。セカンダリアカウントのプライベートプレビュー外部ボリュームのすべての使用はブロックされます。

    • Snowflakeは、複製を有効にする前にプライベートプレビュー外部ボリュームを使用するIcebergテーブルをドロップし、:code:`EXTERNAL_VOLUME = SNOWFLAKE_MANAGED`を使用して再作成することを推奨します。

請求

Snowflakeはお客様のアカウントに次の使用量を請求します。

ストレージコスト

  • Snowflakeは、Snowflakeに保存されたバイトごとに課金します。

    Snowflakeは、Iceberg以外のテーブルのストレージ使用量と合わせて、:doc:`/sql-reference/account-usage/storage_usage`の:code:`STORAGE_BYTES`列でSnowflakeストレージを使用するIcebergテーブルのストレージ使用量を集計します。カタログにコミットされたファイルのみが:code:`STORAGE_BYTES`に含まれます。Snowflakeは、中止されたコミットに対しては課金しません。

    このストレージ使用量に対して発生するコストについては、Snowflakeウェブサイトにある`Snowflakeサービス利用表<https://www.snowflake.com/legal-files/CreditConsumptionTable.pdf>`_のテーブル3(a)で説明されています。

リクエストコスト

注釈

Horizonカタログを介してクエリエンジンを使用しSnowflakeに格納されているIcebergテーブルにアクセスすると、クエリエンジンは外部クエリエンジンとみなされます。外部クエリエンジンを使用してこれらのテーブルにアクセスすると、Snowflakeはこのアクセスの料金をアカウントに請求します。

次のリストでは、外部クエリエンジンがSnowflakeに格納されているIcebergテーブルにアクセスするいくつかのケースについて説明しています。

  • 別のSnowflakeアカウントからHorizonカタログを通じてテーブルにアクセスするSnowflakeエンジン。たとえば、テーブルがSnowflakeアカウントAによって管理されているものの、ユーザーがアカウントBのSnowflakeエンジンからHorizonカタログを通じてテーブルにアクセスした場合は、このアクセスに対して課金されます。アカウントBのSnowflakeエンジンは外部クエリエンジンであるため、このアクセスに対して課金されます。

  • Snowflake Container Servicesを使用してSnowflakeネットワーク内にデプロイされる、サードパーティのクエリエンジン。Horizonカタログを通じてこれらのエンジンを使用しテーブルにアクセスすると、エンジンは外部エンジンであり、リクエストに対して他のサードパーティのクエリエンジンと同じ方法で課金されます。

  • Horizon Catalogを介してテーブルに接続するために使用する、Snowflakeの外部でデプロイするサードパーティのクエリエンジン。

Snowflakeクエリエンジンを使用してこれらのIcebergテーブルに*直接*アクセスした場合、つまりHorizonカタログを通じてアクセスしなかった場合は、Snowflakeによってアカウントに課金されません。たとえば、テーブルがアカウントAによって管理されており、アカウントAのSnowflakeエンジンを使用してテーブルにアクセスした場合、このアクセスに対する料金は請求されません。

  • Snowflake Horizonカタログを通じて外部クエリエンジンを使用して、Snowflakeストレージを使用するIcebergテーブルにアクセスすると、基盤となるストレージシステムに送信した各HTTPリクエストに対する料金がSnowflakeによってアカウントに課金されます。レートはリクエストタイプによって異なります。

    • 「クラス1」として請求されるPUT、COPY、POST、PATCHおよびLISTの各操作。

    • 「クラス2」として請求されるGETおよびSELECTの各操作。

    これらの操作タイプのリクエスト数を表示するには、STORAGE_REQUEST_HISTORY </sql-reference/account-usage/storage_request_history>`アカウント使用状況ビューを使用します。この使用量は、請求レポートに記載されている``STORAGE_REQUEST-1``および``STORAGE_REQUEST-2` SKUsに基づいて課金されます。

    このレートについては、`Snowflakeサービス利用表<https://www.snowflake.com/legal-files/CreditConsumptionTable.pdf>`_のテーブル3(g)で説明されています。

データ転送コスト

  • Horizonカタログを通じて外部クエリエンジンを使用して、別のリージョンから、または別のクラウドプロバイダーを利用してテーブルにアクセスすると、標準のデータ転送料金がバイト単位で課金されます。

    このデータ転送料金については、`Snowflakeサービス利用表<https://www.snowflake.com/legal-files/CreditConsumptionTable.pdf>`_のテーブル4(a)、4(b)、および4(c)で説明されています。

    詳細については、 データ転送のコストについて をご参照ください。

プライベート接続

外部クエリエンジンを使用してSnowflakeストレージを使用するIcebergテーブルにアクセスする場合は、トラフィックがパブリックインターネットを通過しないようにプライベート接続を構成することができます。

セットアップ手順については、 Snowflake管理ストレージボリュームへ をご参照ください。

考慮事項と制約

Snowflakeストレージを使用するIcebergテーブルを操作する場合は、以下の点を考慮してください。

クラウドプロバイダーのサポート

この機能は現在、Amazon Web Services(AWS)またはMicrosoft Azureでホストされているアカウントでのみご利用いただけます。この機能は、政府リージョンまたは中華人民共和国ではご利用いただけません。

暗号化

Snowflakeストレージを使用するIcebergテーブルは、サーバー側の暗号化(SSE)のみをサポートします。顧客管理キー(CMK)は、アカウントで:doc:`Tri-Secret Secure</user-guide/security-encryption-tss>`が有効になっている場合でもサポートされません。

クローニング動作

警告

作成するIcebergテーブルはカタログで指定された認証情報を使用します。カタログで指定された認証情報を使用するIcebergテーブルのクローンを作成すると、クローン作成されたテーブルはソーステーブルと同じベースロケーションを共有します。同じ認証情報を使用して共有ベースロケーションにアクセスできるため、クローン作成されたテーブルにはソーステーブルへの書き込みアクセス権が付与されます。

Snowflakeが管理するストレージを使用するテーブル(EXTERNAL_VOLUME = 'SNOWFLAKE_MANAGED')の場合、:code:`CREATE ICEBERG TABLE ... CLONE`は、ソーステーブルと新しいテーブルの**両方**が一時テーブルである、または**両方*が永続テーブルである場合にのみ成功します。一方が一時テーブルであり、もう一方が永続テーブルである場合、ステートメントは失敗します。

ソーステーブル

クローン

結果

一時的

一時的

サポート対象

永続

永続

サポート対象

一時的

永続

サポート対象外

永続

一時的

サポート対象外

コマンドの構文と、その他のクローニング動作については、:doc:`/sql-reference/sql/create-iceberg-table-snowflake`の:ref:`label-create_iceberg_table_clone_syntax`および:ref:`label-cloning_and_iceberg_tables`をご参照ください。

データの取り込み

以下の方法で、Snowflakeストレージを使用するIcebergテーブルにデータを取り込むことができます。

  • Snowpipe::doc:`Snowpipe</user-guide/data-load-snowpipe-intro>`を使用して、:doc:`COPY INTO </sql-reference/sql/copy-into-table>`を使用するクラウドストレージのファイルからデータをロードします。SnowpipeはIcebergの永続テーブルと一時テーブルの両方で動作します。

  • Snowpipe Streaming::doc:`Snowpipe Streamingハイパフォーマンス</user-guide/snowpipe-streaming/snowpipe-streaming-high-performance-overview>`を使用して、ストリーミングデータを取り込みます。Snowpipe StreamingはIcebergの永続テーブルと一時テーブルの両方で動作します。