事务和 Apache Iceberg™ 表

本主题介绍 Snowflake 如何专门处理 Apache Iceberg™ 表的事务。Snowflake 事务 主题中描述的规则也适用于 Iceberg 表。

将 Snowflake 用作目录的表

对于 使用 Snowflake 作为目录的表,Snowflake 会管理 Iceberg 元数据,以便其他查询引擎(如 Spark)可以从表中读取数据。

查询

当您使用 Snowflake 查询此类表时,该表遵循一般的 Snowflake 事务原则。

Snowflake 目前在事务处理中支持 已提交隔离,以实现更高的并发性和吞吐量,而 Iceberg 目前支持可序列化或快照隔离。

DDL 语句

Snowflake 将 DDL 语句作为单独的事务处理,不会在多个并发事务中隔离 DDL 语句。有关更多信息,请参阅 隐式事务中的 DDL

这与 Iceberg 表使用 DDL 语句来处理事务的常用方式不同,Iceberg 中一个已提交的事务可以同时包含 DML 和 DDL 语句,或者多个捆绑的 DDL 语句。

备注

  • Iceberg 元数据并不总是为每个个体 DDL 更改显示新的架构版本。在某些情况下,Snowflake 会将 DDL 语句分组,并在 Iceberg 元数据中将该分组记录为一个新架构版本。

  • DDL 更改在 Iceberg 元数据中可能会出现顺序混乱,特别是当 DDL 更改与其他 DDL 或 DML 操作紧邻时。

从外部引擎写入 Snowflake 托管的表

Snowflake 目前不支持从外部查询引擎(如 Spark)写入 Snowflake 托管的表。

使用外部目录的表

对于使用外部目录的 Iceberg 表,Snowflake 在运行 ALTER ICEBERG TABLE ... REFRESH 命令时从外部目录检索最新的表状态。

刷新事务

Snowflake 会在单语句事务中自动提交 ALTER ICEBERG TABLE ...REFRESH 语句。

隐式事务 中,当启用 AUTOCOMMIT 时,Snowflake 处理语句的方式与处理任何其他语句的方式相同。

在 :ref:`显式事务 <label-transactions__starting_and_ending_explicitly>`(包含多个语句)中,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 语句,它会将前两个 INSERT INTO TABLE 语句(目前已处理的所有内容)作为事务提交。

  2. 然后,Snowflake 将 ALTER ICEBERG TABLE 语句作为单独的事务提交。

  3. 最后,Snowflake 创建一个新事务并处理剩余的 INSERT INTO 语句。因为块的其余部分不包含 DDL 或刷新语句,它会在区块末尾提交剩余的事务(在 COMMIT).

语言: 中文