Apache Iceberg™ テーブルの管理

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

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

テーブルをクエリする

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

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

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

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

SELECT col1, col2 FROM my_iceberg_table;
Copy

注釈

Along with Snowflake, you can also use an external query engine to query Iceberg tables. For more information, see Use an external query engine with Apache Iceberg™ tables.

DML コマンドを使用する

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

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

注釈

例: テーブルの更新

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"}                         |
+-----------------------------------------------------------------------------------------------------------+

行レベル削除の使用

注釈

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

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

クエリテーブル

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

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

テーブルへの書き込み

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

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

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

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

モード

説明

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

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

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

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

マージオンリード

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

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

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

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

考慮事項と制約

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

  • Snowflake は 位置の削除 のみをサポートしています。

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

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

    使用するテーブルメンテナンスメソッドは、外部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 doesn't support orphan file deletion for Snowflake-managed Iceberg tables. If you see a mismatch between storage usage for your external cloud storage and Snowflake, you might have orphan files in your external cloud storage. To see your storage usage for Snowflake, you can use the TABLE_STORAGE_METRICS ビュー or TABLE_STORAGE_METRICS ビュー. If you see a mismatch, contact Snowflake Support for assistance with determining whether you have orphan files and removing them.

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

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

機能

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

ストレージコストの削減

メモ

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

  • 課金対象。

  • デフォルトで無効。

データ圧縮

  • 課金対象。

  • デフォルトで有効。

マニフェスト圧縮

  • コストなし。

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

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

  • コストなし。

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

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

自動クラスタリング

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

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

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

データ圧縮

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

ほとんどの場合、データ圧縮はコンピューティングコストに大きな影響を与えませんが、これらのコストが気になる場合は、圧縮を無効にすることができます。たとえば、めったにクエリを実行しないテーブルのデータ圧縮を無効にしたい場合などです。データ圧縮を無効化または有効化するには、 データ圧縮の設定 をご参照ください。

注釈

  • 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

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