Apache Iceberg™ テーブルの管理

Snowflakeで Apache Iceberg™ テーブル を管理する

外部カタログを使用するIcebergテーブルを、IcebergカタログとしてSnowflakeを使用するテーブルに変換することもできます。詳細については、 Snowflakeをカタログとして使用するように Apache Iceberg™ テーブルを変換する をご参照ください。

テーブルをクエリする

Icebergテーブルにクエリを実行するには、ユーザーに次の権限を付与または継承させる必要があります。

  • テーブルを含むデータベースとスキーマに対するUSAGE権限。

  • テーブルに対するSELECT権限。

SELECT ステートメントを使用してIcebergテーブルにクエリを実行できます。例:

SELECT col1, col2 FROM my_iceberg_table;
Copy

注釈

Snowflakeと合わせて、外部クエリエンジンを使用してIcebergテーブルをクエリすることもできます。詳細については、 Apache Iceberg™ テーブルでの外部クエリエンジンの使用 をご参照ください。

DML コマンドを使用する

Snowflakeをカタログとして使用するIcebergテーブルは、以下を含む完全な データ操作言語(DML)コマンド をサポートしています。

Snowflake管理テーブルでは、 COPY INTO <テーブル>Snowpipe などの機能を使用した効率的な一括ロードもサポートしています。詳細については、 Apache Iceberg™ テーブルへのデータのロード をご参照ください。

注釈

  • Snowflakeは、外部で管理されているIcebergテーブルへの書き込みもサポートしています。詳細については、 外部管理 Apache Iceberg™ テーブルへの書き込みサポート および 外部管理Icebergテーブルへの書き込み をご参照ください。

  • Snowflake管理のIcebergテーブルの場合、DML 操作が予期せず失敗した場合、ロールバックされます。一部のParquetファイルは、外部クラウドストレージに書き込まれる場合がありますが、Icebergテーブルメタデータによって追跡または参照はされません。これらのParquetファイルは孤立ファイルです。

    外部クラウドストレージとSnowflakeのストレージ使用量が一致しない場合は、外部クラウドストレージに孤立したファイルがある可能性があります。Snowflakeのストレージの使用状況を確認するには、TABLE_STORAGE_METRICS ビュー または TABLE_STORAGE_METRICS ビュー を使用することができます。不一致が表示された場合は、孤立ファイルがあるかどうかを確認し、それらを削除する方法について Snowflakeサポート にお問い合わせください。

例: テーブルの更新

INSERT および UPDATE ステートメントを使用して、Snowflake管理のIcebergテーブルを変更できます。

次の例は、 store_sales という名前のIcebergテーブルに新しい値を挿入し、現在の値が-99の場合、 cola 列を1に更新します。

INSERT INTO store_sales VALUES (-99);

UPDATE store_sales
  SET cola = 1
  WHERE cola = -99;
Copy

DML の変更のスナップショットを生成する

Snowflakeをカタログとして使用するテーブルの場合、Snowflakeは自動的にIcebergメタデータを生成します。Snowflakeはメタデータを外部ボリュームの metadata という名前のフォルダに書き込みます。metadata フォルダーを見つけるには、 データとメタデータのディレクトリ をご参照ください。

あるいは、 SYSTEM$GET_ICEBERG_TABLE_INFORMATION 関数を呼び出して、新しい変更に対してIcebergメタデータを生成することもできます。

Snowflakeで管理されていないテーブルの場合、この関数は最新のリフレッシュされたスナップショットに関する情報を返します。

例:

SELECT SYSTEM$GET_ICEBERG_TABLE_INFORMATION('db1.schema1.it1');
Copy

出力:

+-----------------------------------------------------------------------------------------------------------+
| SYSTEM$GET_ICEBERG_TABLE_INFORMATION('DB1.SCHEMA1.IT1')                                                   |
|-----------------------------------------------------------------------------------------------------------|
| {"metadataLocation":"s3://mybucket/metadata/v1.metadata.json","status":"success"}                         |
+-----------------------------------------------------------------------------------------------------------+

行レベル削除の使用

Snowflakeは、行レベルの削除を使用したテーブルのクエリと、行レベルの削除を使用したテーブルへの書き込みをサポートしています。

クエリテーブル

Snowflakeは、更新、削除、マージ操作に 行レベル削除 を構成している場合、 外部管理Icebergテーブル へのクエリをサポートします。

行レベルの削除を構成するには、Apache Icebergドキュメントの プロパティを書く をご参照ください。

位置削除ファイルを使用してテーブルに書き込む

注釈

  • 外部管理Icebergテーブルのみサポートされています。

  • 行レベルの位置削除を使用するには、IcebergテーブルのIcebergバージョンがデフォルトであるv2に設定されていることを確認します。詳細については、 ICEBERG_VERSION_DEFAULT をご参照ください。Icebergバージョンがv3に設定されている場合、Snowflakeの読み取り時マージ動作は削除ベクターを使用します。

Snowflakeは、Amazon S3、Azure、またはGoogle Cloudに保存されている外部管理Icebergテーブルへの書き込みのための位置行レベルの削除をサポートしています。位置の削除をオフにするには、コピーオン書き込みモードでの DML 操作の実行を有効にするため、テーブル、スキーマ、データベースレベルで ENABLE_ICEBERG_MERGE_ON_READ パラメーターを FALSE に設定します。

削除ベクターを使用してテーブルに書き込む

行レベルのデータ変更を最適化するために、Snowflakeは、Amazon S3、Azure、またはGoogle Cloudに保存された外部管理およびSnowflake管理Icebergテーブルへの書き込み用の削除ベクターをサポートしています。削除ベクターを使用すると、Snowflakeは「読み取り時マージ」(MOR)操作を実行でき、これにより次のDMLステートメントの書き込みパフォーマンスが向上します。

  • DELETE

  • UPDATE

  • MERGE

Snowflakeは、大きなデータファイルを書き換える代わりに、小さなベクターファイルを書き込むことで、このパフォーマンスを実現します。詳しくは、Apache Iceberg仕様の`削除ベクター<https://iceberg.apache.org/spec/#deletion-vectors>`_を参照してください。

削除ベクターを有効にする

削除ベクターを有効にするには、次のステップを実行します。

  1. :ref:`tables-iceberg-configuring-default-version`の指示に従って、IcebergテーブルのデフォルトIcebergバージョンをv3に設定します。

    注釈

    IcebergテーブルのデフォルトIcebergバージョンがv2の場合、Snowflakeは位置削除ファイルを使用して「読み取り時マージ」(MOR)操作を実行します。

  2. :ref:`label-enable_iceberg_merge_on_read`の指示に従って、:code:`ENABLE_ICEBERG_MERGE_ON_READ`パラメーターを:code:`TRUE`(デフォルト)に設定します。

  3. DML操作を書き込み時コピーモードで実行するには、:code:`ENABLE_ICEBERG_MERGE_ON_READ`パラメーターをFALSEに設定します。

削除ベクターの使用上の注意

  • デフォルトの動作

    • ENABLE_ICEBERG_MERGE_ON_READのシステムデフォルトはTRUEです。

  • 書き込みメソッドのヒューリスティック

    • ENABLE_ICEBERG_MERGE_ON_READがTRUEに設定されている場合、Snowflakeはヒューリスティックを使用して、ファイルごとに読み取り時マージまたは書き込み時コピーのどちらを使用するかを決定します。

      • 行数: Snowflakeは、データファイル内の行の約5%未満が削除された場合にのみ、削除ベクターを書き込みます。5%以上が削除された場合、Snowflakeは書き込み時コピーを使用してファイルを書き換えます。

      • ファイルサイズ: Snowflakeが削除ベクターを書き込むには、データファイルが約1.6MBより大きい必要があります。

  • 互換性

    • Iceberg v3の削除ベクターをまだサポートしていないコンピューティングエンジンを使用する場合は、すべての書き込みに書き込み時コピーを強制するために、ENABLE_ICEBERG_MERGE_ON_READをFALSEに設定します。

  • パラメーターの優先順位

    • Snowflakeは、書き込みメソッドを決定するためにENABLE_ICEBERG_MERGE_ON_READパラメーターのみをチェックします。以下のIcebergテーブルプロパティは認識されません。

      • write.delete.mode

      • write.update.mode

      • write.merge.mode

コピーオンライトとマージオンリード

Icebergは、外部管理テーブルの行レベル操作を計算エンジンがどのように処理するかを構成するために2つのモードを提供します。Snowflakeはこの両方のモードをサポートしています。

次の表は、各モードを使用する場合の例です。

モード

説明

コピーオンライト(デフォルト)

このモードは読み出し時間を優先し、書き込み速度に影響します。

更新、削除、またはマージ操作を実行すると、コンピュートエンジンは影響を受けるParquetデータファイル全体を書き換えます。このため、特に大容量データファイルの場合、書き込みに時間がかかることがありますが、読み込み時間には影響しません。

これはデフォルトのモードです。

マージオンリード

このモードは書き込み速度を優先し、読み込み時間に若干の影響を与えます。

更新、削除、またはマージ操作を実行すると、計算エンジンは変更された行のみの情報を含む削除ファイルを作成します。

テーブルから読み込むと、クエリエンジンは削除ファイルとデータファイルをマージします。マージすると読み取り時間が長くなります。しかし、コンパクションやテーブルのメンテナンスを定期的にスケジュールすることで、読み取りパフォーマンスを最適化することができます。

Icebergの行レベルの変更に関する情報は、Apache Icebergドキュメントの 行レベル削除 をご参照ください。

考慮事項と制約

Icebergテーブルで行レベルの削除を使用する場合は、以下の情報を考慮してください。

  • Snowflakeは、v2 Icebergテーブルには`位置削除<https://iceberg.apache.org/spec/#position-delete-files>`_のみをサポートし、v3 Icebergテーブルには`削除ベクター<https://iceberg.apache.org/spec/#deletion-vectors>`_をサポートしています。

  • Snowflakeは、外部管理Icebergテーブルでの位置削除のみをサポートしています。

  • 行レベル削除を使用する際に最高の読み取りパフォーマンスを得るには、定期的にコンパクションとテーブル・メンテナンスを行い、古い削除ファイルを削除してください。詳細については、 外部カタログを使用するテーブルの維持 をご参照ください。

  • ポジション削除が多すぎると、特に未処理のポジション削除は、テーブルの作成やリフレッシュ処理を妨げる可能性があります。この問題を回避するには、テーブルメンテナンスを実行して、余分なポジション削除を削除します。

    使用するテーブルメンテナンスメソッドは、外部Icebergエンジンによって異なります。たとえば、Sparkでは rewrite_data_files メソッドを delete-file-threshold または rewrite-all オプションと共に使用できます。詳細については、Apache Iceberg™ ドキュメントの rewrite_data_files をご参照ください。

ターゲットファイルサイズの設定

SparkやTrinoなどの外部Icebergエンジンのクエリパフォーマンスを改善するために、Snowflakeで管理されるIcebergテーブルと 書き込みサポート付きの外部で管理されるIcebergテーブル の両方のターゲットファイルサイズを構成できます。特定のサイズ(16MB、 32MB、 64MB、または 128MB)を設定するか、 AUTO オプションを使用できます。 AUTO の動作は、テーブルの種類によって異なります。

  • Snowflake 管理テーブル: AUTO は、サイズ、DML パターン、取り込みワークロード、クラスタリング構成などのテーブル特性に基づいて、Snowflakeがテーブルのファイルサイズを選択することを指定します。Snowflakeは、Snowflakeでの読み取りと書き込みパフォーマンスを向上させるために、ファイルサイズを16 MB を起点として自動的に調整します。

  • 外部管理テーブル: AUTO は、Snowflakeがより大きなファイルサイズに積極的にスケーリングすることを指定します。

Icebergテーブルを作成するときに、ターゲットファイルサイズを設定することも、ALTER ICEBERG TABLE コマンドを実行して既存のIcebergテーブルのターゲットファイルサイズを変更することもできます。Snowflakeはテーブル用にParquetファイルを書き込むときに、ファイルサイズがターゲットサイズに近くなるように保とうとします。

ターゲットファイルサイズを設定すると、Snowflakeはすぐに新しいデータ操作言語(DML)操作に対して、すぐにより大きなファイルの作成を開始します。Snowflakeのテーブルメンテナンス操作は、ターゲットファイルサイズに従って既存のテーブルファイルを非同期的に変更します。

次の例では、Snowflake管理テーブルに対して、TARGET_FILE_SIZE を使用してターゲットファイルサイズを128 MB に設定しています。

CREATE ICEBERG TABLE my_iceberg_table (col1 INT)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = 'my_iceberg_table'
  TARGET_FILE_SIZE = '128MB';
Copy

あるいは、既存のテーブルに対して TARGET_FILE_SIZE プロパティを設定するには、ALTER ICEBERG TABLE を使用します。

ALTER ICEBERG TABLE my_iceberg_table
  SET TARGET_FILE_SIZE = '32MB';
Copy

テーブルの TARGET_FILE_SIZE プロパティの値を確認するには、SHOW PARAMETERS コマンドを使用します。

SHOW PARAMETERS LIKE 'target_file_size' FOR my_iceberg_table;
Copy

Snowflake管理のIcebergテーブルのテーブル最適化

テーブルの最適化では、Snowflakeが管理するIcebergテーブルのパフォーマンスを改善してストレージコストを削減するためのメンテナンスを自動的に実行します。

注釈

  • Snowflakeは、Snowflake管理Icebergテーブルの孤立ファイル削除をサポートしていません。外部クラウドストレージとSnowflakeのストレージ使用量が一致しない場合は、外部クラウドストレージに孤立したファイルがある可能性があります。Snowflakeのストレージの使用状況を確認するには、TABLE_STORAGE_METRICS ビュー または TABLE_STORAGE_METRICS ビュー を使用することができます。不一致が表示された場合は、孤立ファイルがあるかどうかを確認し、それらを削除する方法について Snowflakeサポート にお問い合わせください。

  • クエリのパフォーマンスを改善させるために、ターゲットファイルサイズを設定することもできます。詳細については、 ターゲットファイルサイズの設定 をご参照ください。

Snowflakeは、以下の表にまとめたIcebergテーブル最適化機能をサポートしています。

機能

クエリパフォーマンスの改善

ストレージコストの削減

メモ

自動クラスタリング [1]

  • 課金対象。

  • デフォルトで無効。

データ圧縮

  • 課金対象。

  • デフォルトで有効。

マニフェスト圧縮

  • コストなし。

  • 自動的に有効化。無効化できない。

スナップショット有効期限

  • コストなし。

  • 自動的に有効化。無効化できない。

[1] 他のテーブル最適化機能とは異なり、自動クラスタリングは独立した機能として別途請求されます。

自動クラスタリング

自動クラスタリングは、頻繁にクエリされる列に基づいて、ファイルまたはパーティション内のデータを再編成します。Icebergテーブルのファイルサイズは、ターゲットファイルサイズを設定しない限り、クラスタリング構成に基づいています。ターゲットファイルサイズを設定する場合は、ファイルサイズは設定した特定のサイズになります。詳細については、 ターゲットファイルサイズの設定 をご参照ください。

自動クラスタリングを設定するには、Snowflake管理のIcebergテーブルを作成するとき、または既存のテーブルを変更するときに、 CLUSTER BY パラメーターを指定します。詳細については、次をご参照ください。

自動クラスタリングの詳細については、 自動クラスタリング をご参照ください。

データ圧縮

データ圧縮は、ストレージを管理し、最適なファイルサイズを維持し、クエリパフォーマンスを改善するために、小さなファイルを組み合わせてより大きく効率的なファイルにします。

ほとんどの場合、データ圧縮はコンピューティングコストに大きな影響を与えませんが、これらのコストが気になる場合は、圧縮を無効にすることができます。たとえば、テーブルをほとんどクエリしない場合は、そのテーブルの圧縮を無効にすることができます。データ圧縮を無効または有効にする方法については、:ref:`label-tables_iceberg_manage_set_data_compaction`を参照してください。

注釈

  • Icebergテーブルのデータ圧縮ジョブをクエリするには、 ICEBERG_STORAGE_OPTIMIZATION_HISTORY ビュー をご参照ください。このビューには、データ圧縮について請求されるクレジット数が含まれます。

  • 自動クラスタリング が有効な場合、クラスタリングはテーブルでデータ圧縮を実行します。これは、テーブルでデータ圧縮が有効になっているか無効になっているかに関係なく当てはまります。

  • ターゲットファイルサイズを設定するオプションもあります。詳細については、 ターゲットファイルサイズの設定 をご参照ください。

マニフェスト圧縮

マニフェスト圧縮は、より小さなマニフェストファイルを再編成し組み合わせることにより、メタデータレイヤーを最適化します。この圧縮はメタデータのオーバーヘッドを減らし、クエリのパフォーマンスを改善します。

この機能は自動的に有効になり、無効にすることはできません。

スナップショット有効期限

スナップショット有効期限では、古いスナップショットとその固有のデータおよびメタデータファイルをテーブルの履歴からシステム的に削除します。この削除は、事前に定義された保存ポリシーに基づいて行われます。

この機能は自動的に有効になり、無効にすることはできません。

外部カタログを使用するテーブルの維持

外部カタログを使用するIcebergテーブルに対してメンテナンス操作を実行できます。

メンテナンス操作は以下の通り:

  • 期限切れ間近のスナップショット

  • 古いメタデータファイルの削除

  • データファイルのコンパクト化

重要

Icebergテーブルを外部の変更と同期させるためには、Snowflakeのリフレッシュスケジュールをテーブルのメンテナンスに合わせることが重要です。メンテナンス操作を実行するたびに、 テーブルをリフレッシュ します。

Snowflakeで管理されていないIcebergテーブルのメンテナンスについては、Apache Icebergドキュメントの メンテナンス をご参照ください。

テーブルのメタデータをリフレッシュする

外部Icebergカタログを使用する場合、 ALTER ICEBERG TABLE ... REFRESH コマンドを使用してテーブル メタデータをリフレッシュできます。テーブルのメタデータを更新すると、メタデータが最新のテーブルの変更と同期されます。

注釈

サポートされている外部管理テーブルに対して、 自動リフレッシュ を設定することをお勧めします。

テーブルのメタデータを更新する

以下の例では、外部カタログ(AWS Glueまたはデルタなど)を使用するテーブルのメタデータを手動で更新しています。テーブルをリフレッシュすると、リモートカタログで発生した変更とテーブルが同期されます。

この型のIcebergテーブルでは、コマンドでメタデータファイルのパスを指定しません。

ALTER ICEBERG TABLE my_iceberg_table REFRESH;
Copy

テーブルを自動的に更新するには、 自動更新 を設定します。ALTER ICEBERG TABLE コマンドを使用します。

例:

ALTER ICEBERG TABLE my_iceberg_table SET AUTO_REFRESH = TRUE;
Copy

Icebergファイルから作成されたテーブルのメタデータを更新する

次の例では、外部クラウドストレージの場所にある Icebergメタデータファイル から作成されたテーブルを、先頭スラッシュ(/)なしでメタデータファイルへの相対パスを指定して手動でリフレッシュします。メタデータファイルは、更新後のテーブルのデータを定義します。

ALTER ICEBERG TABLE my_iceberg_table REFRESH 'metadata/v1.metadata.json';
Copy

ストレージメトリックの取得

Snowflakeでは、Icebergテーブルの保管コストをお客様のアカウントに請求することはありません。しかし、 Snowflake Information Schema スキーマまたは Account Usage スキーマの TABLE_STORAGE_METRICS ビューと TABLES ビューをクエリすることで、Icebergテーブルがどれだけのストレージを使用しているかを追跡することができます。

次の例のクエリは、 ACCOUNT_USAGE.TABLE_STORAGE_METRICS ビューと ACCOUNT_USAGE.TABLES ビューを結合し、 TABLES.IS_ICEBERG 列でフィルタリングします。

SELECT metrics.* FROM
  snowflake.account_usage.table_storage_metrics metrics
  INNER JOIN snowflake.account_usage.tables tables
  ON (
    metrics.id = tables.table_id
    AND metrics.table_schema_id = tables.table_schema_id
    AND metrics.table_catalog_id = tables.table_catalog_id
  )
  WHERE tables.is_iceberg='YES';
Copy

データ圧縮の設定

データベース、スキーマ、またはテーブルを作成するときに、Snowflake管理Icebergテーブルにデータ圧縮を設定できます。既存のデータベース、スキーマ、またはテーブルの設定を変更するには、 ALTER コマンドを実行します。また、アカウントレベルでデータ圧縮を設定するには、 ALTER ACCOUNT コマンドを使用することもできます。データ圧縮の詳細については、 データ圧縮 をご参照ください。

次の例では、ENABLE_DATA_COMPACTIONを使用して、 Snowflake管理テーブルのデータ圧縮を無効にします。

CREATE ICEBERG TABLE my_iceberg_table (col1 INT)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = 'my_iceberg_table'
  ENABLE_DATA_COMPACTION = FALSE;
Copy

または、既存のテーブルに対して無効化するには、:doc:`/sql-reference/sql/alter-iceberg-table`を使用します。

ALTER ICEBERG TABLE my_iceberg_table
  SET ENABLE_DATA_COMPACTION = FALSE;
Copy

詳細については、次をご参照ください。

Icebergテーブルでデフォルト値を使用する

注釈

このプレビューでサポートされるその他のIceberg v3機能について詳しくは、:doc:`/user-guide/tables-iceberg-v3-specification-support`を参照してください。

このプレビューでは、Iceberg v3仕様に準拠した|iceberg-tm|テーブルのデフォルト値機能のサポートが導入されています。

重要

Icebergテーブルでデフォルト値を使用するには、テーブルが|iceberg-tm|テーブル仕様のv3に準拠している必要があります。テーブルのIcebergバージョンを構成する手順について詳しくは、:ref:`tables-iceberg-configuring-default-version`を参照してください。

この機能により、既存のデータファイルを書き換えることなく、既存および新しいレコードのデフォルト値を設定できます。テーブル列には、次のデフォルト値を設定できます。

  • 初期デフォルト。フィールドが追加されたときに、*既存*のレコードのデフォルト値を提供します。

  • 書き込みデフォルト。書き込み中にデフォルト値を持つフィールドが指定されていない場合に、*新しい*レコードのデフォルト値を提供します。

この機能により、履歴データの値を提示しながらスキーマを進化させ、今後の書き込みのためのフォールバック値を提供することができます。詳しくは、`デフォルト値<https://iceberg.apache.org/spec/#default-values>`_を参照してください。

テーブルを作成または変更するときにデフォルト値を指定できます。

  • 列にデフォルト値を持つテーブルを作成するには、列定義でDEFAULTキーワードを使用します。指定した値は、列の初期デフォルトと書き込みデフォルトの両方として設定されます。列の初期デフォルトは変更できません。

  • テーブルにデフォルト値を持つ列を追加するには、ALTER ICEBERG TABLEコマンドの列定義でDEFAULTキーワードを使用します。指定した値は、列の初期デフォルトと書き込みデフォルトの両方として設定されます。列の初期デフォルトは変更できません。

  • 列の書き込みデフォルトを変更するには、ALTER ICEBERG TABLEコマンドでWRITE DEFAULTキーワードを使用します。

重要

列にデフォルト値を指定する場合は、静的な値を指定する必要があります。値に式や関数を指定することはできません。この要件は、Iceberg v3仕様に準拠しており、初期デフォルトと書き込みデフォルトの両方に適用されます。

以下のセクションでは、デフォルト値を指定し、デフォルトの書き込み値を変更する方法の例を示します。

例:デフォルト値を持つテーブルを作成する

デフォルト値を持つIcebergテーブルを作成するには、:doc:`/sql-reference/sql/create-iceberg-table`コマンドを使用します。

以下の例では、Snowflake管理のIcebergテーブルを作成する際に、まず列のデフォルト値を設定します。次に、デフォルト値を持つ列に値を指定せずに、テーブルにレコードを挿入します。

  1. デフォルト値が``2``である``event_version``列を含む``user_events``テーブルを作成します。

    CREATE ICEBERG TABLE user_events (
        event_id INT,
        user_id INT,
        event_type STRING,
        event_time TIMESTAMP,
        event_version INT DEFAULT 2
      )
      CATALOG = 'SNOWFLAKE'
      EXTERNAL_VOLUME = 'my_external_volume'
      BASE_LOCATION = 'database/schema/user_event'
      ICEBERG_VERSION = 3;
    
    Copy

    テーブル定義にデフォルト値を設定すると、初期デフォルトと書き込みデフォルトが設定されます。列には書き込みデフォルトがあるため、書き込み中に``event_version``が指定されていない場合は、新しいレコードに値``2``が使用されます。

  2. ``event_version``を指定してログインイベントを追加します。

    INSERT INTO user_events VALUES
      (1, 101, 'login', '2025-11-01 10:00:00', 1);
    
    Copy
  3. 購入イベントを追加しますが、``event_version``は指定しません。

    INSERT INTO user_events VALUES
    (1, 101, 'purchase', '2025-11-01 10:01:00');
    
    Copy

    その結果、Snowflakeは``event_version``の値を``2``としてテーブルに入力します。

  4. テーブルをクエリします。

    SELECT * FROM user_events;
    
    Copy

    出力:

    +-----------+----------+-------------+---------------------+----------------+
    | event_id  | user_id  | event_type  | event_time          | event_version  |
    +-----------+----------+-------------+---------------------+----------------+
    | 1         | 101      | login       | 2025-11-01 10:00:00 | 1              |
    | 1         | 101      | purchase    | 2025-11-01 10:01:00 | 2              |
    +-----------+----------+-------------+---------------------+----------------+
    

例:既存のテーブルにデフォルト値を持つ列を追加する

Icebergテーブルにデフォルト値を持つ新しい列を追加するには、:doc:`/sql-reference/sql/alter-iceberg-table`コマンドを使用します。

次の例では、デフォルト値が``2``である``event_version``列を追加することで``user_events``テーブルを変更します。

ALTER ICEBERG TABLE user_events ADD COLUMN event_version INT DEFAULT 2;
Copy

書き込みデフォルトを設定することに加えて、デフォルト値を持つ列を追加すると、列の初期デフォルトも設定されます。その結果、``event_version``列の既存レコードのデフォルト値は``2``になります。

例:列の書き込みデフォルトを変更する

以下の例では、``user_events``テーブルの``event_version``列の書き込みデフォルトを``3``に変更します。

ALTER ICEBERG TABLE user_events ALTER COLUMN event_version SET WRITE DEFAULT 3;
Copy

テーブル用に定義されたデフォルト値を表示する

Snowflake管理または外部管理Icebergテーブルのテーブル列のデフォルト値を表示するには、:doc:`/sql-reference/sql/desc-iceberg-table`コマンドを実行し、出力の``DEFAULT``列と``WRITE DEFAULT``列を表示します。

  • ``DEFAULT``列は、Apache Iceberg仕様の``initial-default``値にマップされます。

  • ``WRITE DEFAULT``列は、Apache Iceberg仕様の``write-default``値にマップされます。

これらの列は、テーブルがv2 Icebergテーブルかv3 Icebergテーブルかに関係なく、出力として返されます。

以下の例では、``user_events``テーブルの列について説明します。このテーブルには、``event_version``列に初期デフォルトと書き込みデフォルトが指定されています。

DESC ICEBERG TABLE user_events
  ->> SELECT
    "name",
    "kind",
    "default",
    "write default"
      FROM $1;
Copy

出力:

+-----------------+---------+---------+---------------+
| name            | kind    | default | write default |
+-----------------+---------+-------------------------+
| EVENT_ID        | COLUMN  |         |               |
| USER_ID         | COLUMN  |         |               |
| EVENT_TYPE      | COLUMN  |         |               |
| EVENT_TIME      | COLUMN  |         |               |
| EVENT_VERSION   | COLUMN  | 2       | 3             |
+-----------------+---------+---------+---------------+

書き込みデフォルトをドロップする

列の書き込みデフォルトをドロップするには、ALTER ICEBERG TABLEコマンドで``DROP WRITE DEFAULT``キーワードを使用します。

以下の例では、``event_version``列のデフォルト書き込み値をドロップします。

ALTER ICEBERG TABLE user_events ALTER COLUMN event_version DROP WRITE DEFAULT;
Copy

デフォルト値の考慮事項と制限

Snowflake管理および外部管理Icebergテーブルでデフォルト値を使用する場合は、以下の項目を考慮してください。

Snowflake管理および外部管理Icebergテーブル

  • 列を作成した後に、後から初期デフォルトを追加したり変更したりすることはできません。したがって、ALTER TABLE ... DROP COLUMNおよびALTER TABLE ... ADD COLUMNコマンドを使用し、列をドロップしてから列を追加する必要があります。

  • デフォルト値の最大サイズは128|~|MBです。

  • デフォルト値は、定数として表すことができないデータ型を使用できないため、デフォルト値では以下のデータ型を使用できません。

    • マップ

    • list

    • struct

    • variant

Snowflake管理Icebergテーブル

  • ``write-default``値は常に``initial-default``値に初期化されます。これらの値のデフォルトを確認するには、DESCRIBE ICEBERG TABLEコマンドを実行し、出力の``WRITE DEFAULT``および``DEFAULT``列を表示します。

  • TIMESTAMP_NTZ(9)またはTIMESTAMP_LTZ(9)データ型を使用するデフォルト値は指定できません。

  • テーブルを*作成*するときにのみ、デフォルト値を``DEFAULT pi()``などの式に設定できます。ALTER ICEBERG TABLEコマンドを使用してテーブルを*変更*するときに、デフォルト値を式に設定することはできません。

  • シーケンスはサポートされていません。

    たとえば、次のCREATE ICEBERG TABLEコマンドは``LOG_ID NUMBER(38,0) NOT NULL autoincrement order``が含まれているため失敗します。

    CREATE OR REPLACE ICEBERG TABLE CDC_RUN_LOG (
        LOG_ID NUMBER(38,0) NOT NULL autoincrement order,
        ENTITY_NAME VARCHAR(100),
        LAST_RUN TIMESTAMP_NTZ(9),
        DAG_NAME VARCHAR(100)
        )
        CATALOG = 'SNOWFLAKE'
        EXTERNAL_VOLUME = 'my_external_volume'
        BASE_LOCATION = 'my_iceberg_table';
        COMMENT='CDC table to manage log of runs'
        ICEBERG_VERSION = 3;
    
    Copy

外部管理Icebergテーブル

  • TIMESTAMP_NTZ(9)またはTIMESTAMP_LTZ(9)データ型を使用するデフォルト値は指定できません。

これらの考慮事項と制限は、Iceberg v3の機能であるデフォルト値に適用されます。すべてのIceberg v3テーブルに適用される考慮事項と制限のリストについて詳しくは、:ref:`iceberg-v3_considerations_limitations`を参照してください。

Icebergテーブルで行系統を使用する

注釈

このプレビューでサポートされるその他のIceberg v3機能について詳しくは、:doc:`/user-guide/tables-iceberg-v3-specification-support`を参照してください。

このプレビューでは、|iceberg-tm|テーブルの行系統機能のサポートが導入されています。この機能により、以下の列はSnowflakeによってIcebergテーブルに自動的に書き込まれます。

  • _row_id

  • _last_updated_sequence_number

この機能により、クエリエンジンはスナップショット全体で同じ行を確実に一致させ、行レベルの変更を検出できます。詳しくは、`行系統<https://iceberg.apache.org/spec/#row-lineage>`_を参照してください。

この機能は、Snowflake管理および外部管理Icebergテーブルの両方でサポートされています。

重要

Icebergテーブルで行系統を使用するには、テーブルが|iceberg-tm|テーブル仕様のv3に準拠している必要があります。テーブルのIcebergバージョンを構成する手順について詳しくは、:ref:`tables-iceberg-configuring-default-version`を参照してください。

行系統に関する考慮事項と制限

行系統は、次の点を考慮してストリームでサポートされています。

  • 追加専用ストリームと標準ストリームは、Snowflake管理Iceberg v3テーブルでサポートされています。

  • 外部管理Iceberg v3テーブルでは、挿入専用ストリームと標準ストリームがサポートされています。

    • 標準ストリームが正しい結果を生成するようにするには、外部エンジンはIceberg v3の仕様に従ってIceberg v3テーブルに書き込む必要があります。具体的には、新しく挿入された行には:code:`_row_id=NULL`が必要です。書き込み時コピー中にコピーされた行は、:code:`_row_id`を維持する必要があります。

    • MAX_DATA_EXTENSION_TIME_IN_DAYSは外部管理Iceberg v3テーブルでは機能しません。

  • DMLsが複数ステートメントのトランザクションでコミットされる場合、Iceberg v3テーブルの追加専用ストリームは、Iceberg v2テーブルと比較して異なるセマンティクスを持ちます。

    • Iceberg v2では、追加専用ストリームにおいて、複数ステートメントのトランザクションで行が追加されてから削除された場合、この行は挿入とみなされます。

    • Iceberg v3では、追加専用ストリームにおいて、この行は挿入として扱われません。

これらの考慮事項と制限は、Iceberg v3からの機能である行系統に適用されます。すべてのIceberg v3テーブルに適用される考慮事項と制限のリストについて詳しくは、:ref:`iceberg-v3_considerations_limitations`を参照してください。