トランザクションと Apache Iceberg™ テーブル

このトピックでは、Snowflakeが特に Apache Iceberg™ テーブルのトランザクションをどのように処理するかについての情報を提供します。Snowflake トランザクション トピックで説明したルールは、Icebergテーブルにも適用されます。

Snowflakeをカタログとして使用するテーブル

カタログとしてSnowflakeを使用するテーブル の場合、SnowflakeはIcebergメタデータを管理し、Sparkなどの他のクエリエンジンがテーブルから読み込めるようにします。

クエリ

Snowflakeを使用してこのタイプのテーブルをクエリする場合、テーブルは一般的なSnowflakeトランザクションの原則に従います。

Snowflakeは現在、トランザクションの並行性とスループットを向上させるために、 読み取りコミット分離 をサポートしています。一方、Icebergは現在、シリアライズ可能な分離またはスナップショット分離をサポートしています。

DDL ステートメント

Snowflakeは DDL ステートメントを個別のトランザクションとして処理し、複数の同時トランザクション間で DDL ステートメントを分離しません。詳しくは、 暗黙的なトランザクションの DDL を参照してください。

これは、Icebergテーブルが一般的に DDL ステートメントを持つトランザクションを処理する方法とは異なります。1つのコミットされたトランザクションには、 DML ステートメントと DDL ステートメントの両方、または複数のバンドルされた DDL ステートメントを含めることができます。

注釈

  • Icebergのメタデータは、 DDL の変更ごとに新しいスキーマバージョンを表示するとは限りません。場合によっては、Snowflakeは DDL ステートメントをグループ化し、そのグループを1つの新しいスキーマバージョンとしてIcebergのメタデータに記録します。

  • DDL の変更は、特に DDL の変更が他の DDL や DML の操作に近接して発生した場合、Icebergのメタデータ上では順番が狂って表示される可能性があります。

外部エンジンからSnowflake管理テーブルへの書き込み

Snowflakeは現在、Sparkなどの外部クエリエンジンからSnowflakeが管理するテーブルへの書き込みをサポートしていません。

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

外部カタログを使用するIcebergテーブルの場合、 ALTER ICEBERG TABLE ... REFRESH コマンドを実行すると、Snowflakeは外部カタログから最新のテーブル状態を取得します。

トランザクションのリフレッシュ

Snowflakeは、 ALTER ICEBERG TABLE ... REFRESH ステートメントを単一ステートメントトランザクション内で自動的にコミットします。

暗黙的なトランザクション では、 AUTOCOMMIT が有効な場合、Snowflakeは他のステートメントと同じ方法でステートメントを処理します。

明示的なトランザクション (複数のステートメントを持つ)では、Snowflakeは明示的なトランザクションブロックをコミットする前に、単一ステートメントトランザクションとしてリフレッシュを実行し、自動的にコミットします。

外部管理テーブルへの書き込み

Snowflakeは現在、外部管理テーブルへの書き込みをサポートしていません。

複数ステートメントトランザクション

Snowflakeは、複数の DML ステートメントをアトミックにコミットすることで、複数ステートメントトランザクションをサポートしており、以下のロジックを使用しています。

  • 各 DDL ステートメントは、トランザクションが発生すると、個別のトランザクションとして実行されます。

  • ALTER ICEBERG TABLE ... REFRESH の各操作は、発生した時点で単一のトランザクションとして実行されます。

  • 明示的または暗黙的なトランザクション内の他のすべてのステートメントは、グループ化され、単一のトランザクションとしてコミットされます

SnowflakeのIcebergテーブルに対する明示的なトランザクションブロックの次の例を考えてみましょう。

BEGIN
  INSERT INTO table1 VALUES (1, "One");
  INSERT INTO table1 VALUES (2, "Two");
  ALTER ICEBERG TABLE table1 ALTER COLUMN c3 SET DATA TYPE ARRAY(long);
  INSERT INTO table1 VALUES (3, "Three");
  INSERT INTO table1 VALUES (4, "Four");
COMMIT;
Copy
  1. Snowflakeは ALTER ICEBERG TABLE ステートメントに遭遇すると、最初の2つの INSERT INTO TABLE ステートメント(これまでに処理されたすべて)をトランザクションとしてコミットします。

  2. その後、Snowflakeは ALTER ICEBERG TABLE ステートメントを別のトランザクションとしてコミットします。

  3. 最後に、Snowflakeは新しいトランザクションを作成し、残りの INSERT INTO ステートメントを処理します。ブロックの残りの部分には DDL やリフレッシュステートメントが含まれていないため、ブロックの最後(COMMIT)に残りのトランザクションをコミットします。