雪花如何在内部执行更新?

How snowflake internally performs updates?

据我所知,底层文件(柱状格式)是不可变的。我的问题是,如果文件是不可变的,那么更新是如何执行的。 Snowflake是否维护同一行的不同版本,并且returns根据key维护最新版本?或者它在幕后将数据插入新文件并删除旧文件?如果将时间旅行设置为 90 天,因为 Snowflake 需要维护同一行的不同版本,那么在这些场景(查询当前数据)中性能如何受到影响。但是由于 Snowflake 不尊重密钥,因此甚至可以检测到不同的版本。对详细内部结构的任何见解 (document/video) 表示赞赏。

这是一个复杂的问题,但基本思路如下(简化了很多):

  • 记录存储在 S3 上的 immutable 微分区中
  • a table 是微分区列表
  • 修改记录时
    • 它的旧微分区被标记为不活动(从那一刻起),
    • 创建了一个新的微分区,其中包含修改后的记录,但也包含该微分区中的其他记录。
    • 新的微分区被添加到 table 的列表中(从那时起标记为活动)
  • 一段时间内不删除不活动的微分区,允许时间旅行

因此 Snowflake 不需要记录密钥,因为每条记录仅存储在给定时间处于活动状态的一个文件中。

执行更新对查询的影响很小,唯一可见的影响可能是需要从 S3 获取文件并缓存在仓库中。

有关更多信息,我建议去 Snowflake 论坛并在那里询问。