Apache Iceberg™ テーブルの管理¶
Snowflakeで Apache Iceberg™ テーブル を管理する
外部カタログを使用するIcebergテーブルを、IcebergカタログとしてSnowflakeを使用するテーブルに変換することもできます。詳細については、 Snowflakeをカタログとして使用するように Apache Iceberg™ テーブルを変換する をご参照ください。
テーブルをクエリする¶
Icebergテーブルにクエリを実行するには、ユーザーに次の権限を付与または継承させる必要があります。
テーブルを含むデータベースとスキーマに対するUSAGE権限。
テーブルに対するSELECT権限。
SELECT ステートメントを使用してIcebergテーブルにクエリを実行できます。例:
SELECT col1, col2 FROM my_iceberg_table;
DML コマンドを使用する¶
Snowflakeをカタログとして使用するIcebergテーブルは、以下を含む完全な データ操作言語(DML)コマンド をサポートしています。
Snowflake管理テーブルでは、 COPY INTO <テーブル> や Snowpipe などの機能を使用した効率的な一括ロードもサポートしています。詳細については、 Apache Iceberg™ テーブルへのデータのロード をご参照ください。
注釈
Snowflake also supports writing to externally managed Iceberg tables. For more information, see 外部管理 Apache Iceberg™ テーブルへの書き込みサポート and 外部管理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;
DML の変更のスナップショットを生成する¶
Snowflakeをカタログとして使用するテーブルの場合、Snowflakeは自動的にIcebergメタデータを生成します。Snowflakeはメタデータを外部ボリュームの metadata という名前のフォルダに書き込みます。metadata フォルダーを見つけるには、 データとメタデータのディレクトリ をご参照ください。
あるいは、 SYSTEM$GET_ICEBERG_TABLE_INFORMATION 関数を呼び出して、新しい変更に対してIcebergメタデータを生成することもできます。
Snowflakeで管理されていないテーブルの場合、この関数は最新のリフレッシュされたスナップショットに関する情報を返します。
例:
SELECT SYSTEM$GET_ICEBERG_TABLE_INFORMATION('db1.schema1.it1');
出力:
+-----------------------------------------------------------------------------------------------------------+
| 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 をご参照ください。
ターゲットファイルサイズの設定¶
To improve query performance for external Iceberg engines such as Spark or Trino, you can configure a target file size for both Snowflake-managed and externally managed Iceberg tables with write support. You can either set a specific size (16MB, 32MB, 64MB, or 128MB), or use the AUTO option. AUTO works differently, depending on the table type:
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';
あるいは、既存のテーブルに対して TARGET_FILE_SIZE プロパティを設定するには、ALTER ICEBERG TABLE を使用します。
ALTER ICEBERG TABLE my_iceberg_table
SET TARGET_FILE_SIZE = '32MB';
テーブルの TARGET_FILE_SIZE プロパティの値を確認するには、SHOW PARAMETERS コマンドを使用します。
SHOW PARAMETERS LIKE 'target_file_size' FOR my_iceberg_table;
Snowflake管理のIcebergテーブルのテーブル最適化¶
テーブルの最適化では、Snowflakeが管理するIcebergテーブルのパフォーマンスを改善してストレージコストを削減するためのメンテナンスを自動的に実行します。
注釈
Snowflakeは、Snowflake管理Icebergテーブルの孤立ファイル削除をサポートしていません。外部クラウドストレージとSnowflakeのストレージ使用量が一致しない場合は、外部クラウドストレージに孤立したファイルがある可能性があります。Snowflakeのストレージの使用状況を確認するには、TABLE_STORAGE_METRICS ビュー または TABLE_STORAGE_METRICS ビュー を使用することができます。不一致が表示された場合は、孤立ファイルがあるかどうかを確認し、それらを削除する方法について Snowflakeサポート にお問い合わせください。
To improve query performance, you can also set a target file size. For more information, see ターゲットファイルサイズの設定.
Snowflakeは、以下の表にまとめたIcebergテーブル最適化機能をサポートしています。
機能 |
クエリパフォーマンスの改善 |
Reduces storage costs |
メモ |
|---|---|---|---|
自動クラスタリング [1] |
✔ |
✔ |
|
✔ |
✔ |
|
|
✔ |
✔ |
|
|
✔ |
✔ |
|
:sub:`[1] 他のテーブル最適化機能とは異なり、自動クラスタリングは独立した機能として別途請求されます。 `
自動クラスタリング¶
自動クラスタリングは、頻繁にクエリされる列に基づいて、ファイルまたはパーティション内のデータを再編成します。Icebergテーブルのファイルサイズは、ターゲットファイルサイズを設定しない限り、クラスタリング構成に基づいています。ターゲットファイルサイズを設定する場合は、ファイルサイズは設定した特定のサイズになります。詳細については、 ターゲットファイルサイズの設定 をご参照ください。
自動クラスタリングを設定するには、Snowflake管理のIcebergテーブルを作成するとき、または既存のテーブルを変更するときに、 CLUSTER BY パラメーターを指定します。詳細については、次をご参照ください。
自動クラスタリングの詳細については、 自動クラスタリング をご参照ください。
Data compaction¶
データ圧縮は、ストレージを管理し、最適なファイルサイズを維持し、クエリパフォーマンスを改善するために、小さなファイルを組み合わせてより大きく効率的なファイルにします。
In most cases, data compaction doesn't have a significant effect on compute costs, but if these costs are a concern, you can disable compaction. For example, you might want to disable compaction on a table if you rarely query it. To disable or enable data compaction, see データ圧縮の設定.
注釈
Icebergテーブルのデータ圧縮ジョブをクエリするには、 ICEBERG_STORAGE_OPTIMIZATION_HISTORY ビュー をご参照ください。このビューには、データ圧縮について請求されるクレジット数が含まれます。
If you have 自動クラスタリング enabled, clustering performs data compaction on the table. This is true, regardless of whether data compaction is enabled or disabled on the table.
ターゲットファイルサイズを設定するオプションもあります。詳細については、 ターゲットファイルサイズの設定 をご参照ください。
Manifest compaction¶
マニフェスト圧縮は、より小さなマニフェストファイルを再編成し組み合わせることにより、メタデータレイヤーを最適化します。この圧縮はメタデータのオーバーヘッドを減らし、クエリのパフォーマンスを改善します。
この機能は自動的に有効になり、無効にすることはできません。
スナップショット有効期限¶
スナップショット有効期限では、古いスナップショットとその固有のデータおよびメタデータファイルをテーブルの履歴からシステム的に削除します。この削除は、事前に定義された保存ポリシーに基づいて行われます。
この機能は自動的に有効になり、無効にすることはできません。
外部カタログを使用するテーブルの維持¶
外部カタログを使用するIcebergテーブルに対してメンテナンス操作を実行できます。
メンテナンス操作は以下の通り:
期限切れ間近のスナップショット
古いメタデータファイルの削除
データファイルのコンパクト化
重要
Icebergテーブルを外部の変更と同期させるためには、Snowflakeのリフレッシュスケジュールをテーブルのメンテナンスに合わせることが重要です。メンテナンス操作を実行するたびに、 テーブルをリフレッシュ します。
Snowflakeで管理されていないIcebergテーブルのメンテナンスについては、Apache Icebergドキュメントの メンテナンス をご参照ください。
テーブルのメタデータをリフレッシュする¶
外部Icebergカタログを使用する場合、 ALTER ICEBERG TABLE ... REFRESH コマンドを使用してテーブル メタデータをリフレッシュできます。テーブルのメタデータを更新すると、メタデータが最新のテーブルの変更と同期されます。
注釈
サポートされている外部管理テーブルに対して、 自動リフレッシュ を設定することをお勧めします。
テーブルのメタデータを更新する¶
以下の例では、外部カタログ(AWS Glueまたはデルタなど)を使用するテーブルのメタデータを手動で更新しています。テーブルをリフレッシュすると、リモートカタログで発生した変更とテーブルが同期されます。
この型のIcebergテーブルでは、コマンドでメタデータファイルのパスを指定しません。
ALTER ICEBERG TABLE my_iceberg_table REFRESH;
テーブルを自動的に更新するには、 自動更新 を設定します。ALTER ICEBERG TABLE コマンドを使用します。
例:
ALTER ICEBERG TABLE my_iceberg_table SET AUTO_REFRESH = TRUE;
Icebergファイルから作成されたテーブルのメタデータを更新する¶
次の例では、外部クラウドストレージの場所にある Icebergメタデータファイル から作成されたテーブルを、先頭スラッシュ(/)なしでメタデータファイルへの相対パスを指定して手動でリフレッシュします。メタデータファイルは、更新後のテーブルのデータを定義します。
ALTER ICEBERG TABLE my_iceberg_table REFRESH 'metadata/v1.metadata.json';
ストレージメトリックの取得¶
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';
データ圧縮の設定¶
You can set data compaction on Snowflake-managed Iceberg tables when you create a database, schema, or table, or run the ALTER command to change the setting for an existing database, schema, or table. You can also set data compaction at the account level by using the ALTER ACCOUNT command. For more information about data compaction, see Data compaction.
次の例では、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;
または、既存のテーブルに対して無効化するには、:doc:`/sql-reference/sql/alter-iceberg-table`を使用します。
ALTER ICEBERG TABLE my_iceberg_table
SET ENABLE_DATA_COMPACTION = FALSE;
詳細については、次をご参照ください。