Understanding immutability constraints

不可变性约束允许您将动态表的某些部分标记为静态。定义不可变性约束时,Snowflake 会在刷新期间跳过这些行,从而提高性能,特别适用于包含大量历史数据的表。

在创建或更改动态表时,您可以使用 IMMUTABLE WHERE 子句定义不可变性约束。该子句会指定一个条件或谓词,用于标识哪些行不可变。

关键行为:

  • 初始刷新:在初始刷新期间,Snowflake 会忽略 IMMUTABLE WHERE 谓词,但在后续所有刷新中生效。

  • Full refresh mode: The predicate limits recomputation to only the rows that don't match the condition.

  • Incremental refresh: Streams and incremental refresh dynamic tables can read from full refresh dynamic tables that have immutability constraints.

  • 克隆和复制:Snowflake 会复制 IMMUTABLEWHERE 约束,没有任何限制。

For information about compute costs, see 计算不变性约束的成本.

When to use immutability constraints

Immutability constraints are useful in the following scenarios:

避免重新处理历史数据

当动态表包含您不想重新处理的历史数据时,请将较旧的行标记为不可变。

优化全量刷新模式

采用全量 刷新模式 的动态表通常在每次刷新期间重新计算所有行。不可变性约束仅限重新计算可变行,从而显著减少了大多数数据为历史数据时的工作量。

促进增量下游刷新

某些查询结构,例如 Python 用户定义的表函数,需要动态表采用全量刷新模式。通常,这会阻止下游表从增量刷新中受益。当上游表具有不可变性约束时,下游表仍然可以从增量处理中受益。

使用具有不可变性的回填

回填扩展了不可变性约束。回填是一种零复制操作,让您可以立即将现有数据复制到动态表,而无需重新计算。借此可以迁移现有管道、更改动态表定义,或在创建包含多年历史数据的表时避免昂贵的初始化。

回填的数据在未来刷新期间无法更改。

在创建同时包含 IMMUTABLE WHEREBACKFILL FROM 的动态表时:

  • 回填从源表中复制 不可变区域。不可变区域包含与 IMMUTABLE WHERE 条件匹配的行。

  • 查询定义会计算 可变区域。可变区域包含与条件不匹配的行。

后续步骤

For implementation guidance and examples, see 回填示例 and Immutability constraints.

语言: 中文