Snowflake で Iceberg を使えば Snowpipe は不要になるのか?

Snowflake で Apache Iceberg を使い始めると「Snowpipe はもう不要なのでは?」という疑問が浮かびます。結論はユースケース次第で、完全な置き換えではなく使い分けが重要です。

Snowpipe と Iceberg(外部テーブル)の役割の違い

まず両者が何をするものなのかを整理します。

SnowpipeIceberg(外部テーブル)
目的外部ストレージ → Snowflake 管理ストレージへのコピー・ロード外部ストレージの Iceberg 形式データを直接クエリ
データの場所Snowflake 内部に取り込むS3 等の外部に置いたまま
レイテンシ自動・準リアルタイムで取り込みクエリ時に外部ストレージを参照

Snowpipe は「データを Snowflake に持ち込む仕組み」、Iceberg は「外部データをそのまま Snowflake から使う仕組み」です。目的が根本的に異なります。

Snowpipe が不要になるケース

以下のような要件では、Iceberg テーブルだけで Snowpipe なしに構成できます。

  • データを Snowflake にコピーしたくない(外部ストレージにデータを置いたままクエリしたい)
  • 他のツール(Spark、Trino 等)とデータを共有したい
  • ストレージコストを抑えたい(Snowflake と S3 で二重管理を避ける)
-- カタログ統合(AWS Glue 等)を使った Iceberg テーブル作成例
CREATE OR REPLACE ICEBERG TABLE my_iceberg_table
  EXTERNAL_VOLUME = 'my_s3_volume'
  CATALOG = 'my_glue_catalog_integration'
  CATALOG_NAMESPACE = 'my_database'
  CATALOG_TABLE_NAME = 'my_table';

-- 通常の SQL でクエリ可能
SELECT * FROM my_iceberg_table WHERE dt = '2026-05-01';

データレイクハウス的な構成を目指すならこのアプローチが有効です。

Snowpipe が依然として必要なケース

一方、以下の要件があれば Snowpipe(または Snowpipe Streaming)は引き続き有効です。

  • クエリパフォーマンス重視: Snowflake 管理テーブルの方が外部テーブルより一般的に高速。マイクロパーティションのクラスタリングやキャッシュが効きます
  • DML(UPDATE / DELETE / MERGE)を頻繁に行う: 外部 Iceberg テーブルは DML の柔軟性に制限があるケースがあります
  • ストリーミング取り込み: Snowpipe Streaming はミリ秒単位の低レイテンシ取り込みに対応しています
  • クラスタリングキーや検索最適化を活用したい: Snowflake 管理テーブル固有の最適化機能を使いたい場合
-- Snowpipe 定義例(S3 イベント通知と組み合わせて使う)
CREATE OR REPLACE PIPE my_pipe
  AUTO_INGEST = TRUE
AS
  COPY INTO my_table
  FROM @my_s3_stage
  FILE_FORMAT = (TYPE = 'PARQUET');

アーキテクチャ選択の考え方

外部ストレージ(S3 等)にデータを置いたまま使いたい
  → Iceberg 外部テーブル(Snowpipe は不要)

パフォーマンス・DML・ストリーミングが重要
  → Snowpipe / Snowpipe Streaming でのロード

両者は排他的ではなく、コールドデータは Iceberg 外部テーブル、ホットデータは Snowpipe 取り込みというハイブリッド構成も現実的な選択肢です。

業務での使いどころ

Iceberg を選ぶ場面:

  • データレイク(S3)に既に Iceberg 形式でデータが蓄積されており、Snowflake からもアドホッククエリしたい
  • Spark / Trino / Athena など Snowflake 以外のエンジンと同じデータを参照したい
  • Historical データを Snowflake に二重にコピーするコストを避けたい

Snowpipe を選ぶ場面:

  • リアルタイムダッシュボード用のデータを低レイテンシで取り込みたい
  • 頻繁に UPDATE/MERGE が発生するマスタデータの管理
  • 既存の Snowflake 管理テーブルと結合する前提でパフォーマンスを出したい

ハマりやすいポイント

Iceberg 外部テーブルのメタデータ更新タイミング

外部 Iceberg テーブルは Snowflake が S3 のメタデータをキャッシュするため、S3 側でデータが更新されても即座に反映されないことがあります。REFRESH コマンドで手動更新するか、自動リフレッシュ設定を確認してください。

ALTER ICEBERG TABLE my_iceberg_table REFRESH;

Snowpipe Streaming の Iceberg テーブルはレイテンシが長い

Snowpipe Streaming を Iceberg 管理テーブルに使う場合、デフォルトのフラッシュ間隔が 30 秒です(通常の Snowflake 管理テーブルは 1 秒)。リアルタイム性が求められる用途ではこの遅延差を考慮した設計が必要です。

Snowpipe Streaming のチャネル管理

クライアント側でチャネルを適切に管理しないとデータの重複や順序保証の問題が発生します。チャネルは長期間オープンしたまま使い続け、getLatestCommittedOffsetToken() で定期的にコミット済みオフセットを確認するのがベストプラクティスです。

コスト試算を忘れずに

Iceberg 外部テーブルは S3 への API コールが発生するため、クエリ頻度が高い場合は Snowflake にコピーした方がトータルコストが低くなるケースもあります。

まとめ

  • Iceberg を使えば Snowpipe が不要になる場面はある(外部データをそのまま参照したい場合)
  • ただし完全に置き換わるわけではない(パフォーマンスや DML 要件がある場合は Snowpipe が有効)
  • データの配置戦略とクエリ要件をセットで考えることが重要

データレイクハウス的な設計を進めるなら Iceberg は強力な選択肢です。一方で既存の Snowpipe パイプラインをすぐに廃止する必要はなく、用途に応じて使い分けるのが現実的なアプローチです。