了解动态表中的主键

Snowflake 可以利用动态表和动态 Iceberg 表中的主键更高效地跟踪行级变更,并在全量刷新动态表的下游实现增量刷新。Snowflake 不再依赖变更跟踪列,而是将主键作为稳定的行标识符,以此计算两次刷新之间的最小变更集。

这在以下场景中尤为有用:

  • 基表通过 INSERT OVERWRITE 定期重写而非就地更新,这通常会导致 Snowflake 无法检测版本间的差异。

  • 管道从外部管理的 Apache Iceberg™ v2 表中读取数据,此类表先于行沿袭存在。

  • 某些动态表因使用了不支持的增量构建而必须使用全量刷新模式,但其下游表仍能从增量处理中获益。

动态表中的主键类型

Snowflake 支持动态表的两种类型的主键用例:1) 行级变更跟踪,以及 2) 为动态表本身派生唯一键。

基于主键行级沿袭的变更跟踪

当基表的主键约束设置了 RELY 属性时,Snowflake 会使用该键在下游动态表中进行行级变更跟踪。这在基表通过 INSERT OVERWRITE 定期重写时特别有用,因为这种情况通常会阻断跨表版本的变更跟踪。

借助可靠的主键,Snowflake 可以通过比较主键值来识别刷新间隔中发生变更的行,而无需依赖内部变更跟踪列。这样即使基础数据被完全替换,也能实现增量处理。

要在基表主键上设置 RELY 属性,请执行以下操作:

ALTER TABLE my_base_table ALTER CONSTRAINT my_pk_constraint RELY;

唯一键派生

Snowflake 可以根据动态表的查询定义自动派生出可靠的唯一键。例如,以下 SQL 结构会生成派生唯一键:

  • GROUP BY:分组列会构成唯一键,因为每个分组只会产生一行输出。

  • QUALIFY ROW_NUMBER() = 1:分区列会构成唯一键,因为筛选器确保每个分区仅保留一行。

  • 可靠的基表主键:基表的主键被用作动态表的唯一键。

Snowflake 会将派生的主键注册为动态表的唯一性约束。由于这些约束源自查询结构,因此完全可靠,无需额外验证。

要检查动态表是否拥有派生主键,请运行:

SHOW UNIQUE KEYS IN my_dynamic_table;

何时使用主键

主键在以下场景中很有用:

改进 INSERT OVERWRITE 工作负载的变更跟踪

当基表通过 INSERT OVERWRITE 定期重写时,Snowflake 无法使用标准变更跟踪列来检测变化。主键允许 Snowflake 按键值对比行,并仅处理实际发生的变更,从而避免对动态表进行全量重新计算。

在全量刷新动态表下游启用增量刷新

通常情况下,增量刷新模式下的动态表不能是全量刷新模式下动态表的下游。当上游全量刷新动态表拥有系统派生的唯一键时,Snowflake 即可计算两次全量刷新之间的变更,从而允许下游表进行增量刷新。这消除了增量管道中的一个主要障碍。

减少管道中的变更传播

主键可在管道的每个阶段实现基于值的变更缩减。Snowflake 可以筛选出新旧版本中主键相同且数值一致的行,从而减少传播到下游表的变更量。

关键行为

  • 选择开启下游增量刷新:要对从具有派生唯一键的全量刷新动态表中读取的动态表使用增量刷新,必须在下游表上显式设置 REFRESH_MODE = INCREMENTAL。设置 REFRESH_MODE = AUTO 后仍将解析为 FULL。

  • 验证基于主键的变更跟踪支持:使用 SHOW UNIQUE KEYS IN <dt_name> 检查动态表是否具有派生的唯一键。或者,使用 REFRESH_MODE = INCREMENTAL 创建下游动态表,并检查是否创建成功。

  • 掩码策略:对主键列进行脱敏处理的掩码策略会阻止 Snowflake 使用这些键进行变更跟踪。在这种情况下,Snowflake 会回退到标准变更跟踪列。

后续步骤

有关示例和实施指南,请参阅 使用主键优化动态表管道

有关 CREATE DYNAMIC TABLE 的完整语法,请参阅 CREATE DYNAMIC TABLE