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 WHERE 和 BACKFILL FROM 的动态表时:
回填从源表中复制 不可变区域。不可变区域包含与
IMMUTABLE WHERE条件匹配的行。查询定义会计算 可变区域。可变区域包含与条件不匹配的行。
后续步骤¶
For implementation guidance and examples, see 回填示例 and Immutability constraints.