代码之家  ›  专栏  ›  技术社区  ›  Manu Batham

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

  •  6
  • Manu Batham  · 技术社区  · 6 年前

    据我所知,底层文件(列格式)是不可变的。我的问题是,如果文件是不可变的,那么更新是如何执行的。Snowflake是否维护同一行的不同版本,并根据键返回最新版本?还是将数据插入到场景后面的新文件中并删除旧文件?如果时间旅行设置为90天,因为Snowflake需要维护同一行的不同版本,那么在这些场景(查询当前数据)中性能会受到怎样的影响。但由于Snowflake不尊重密钥,所以即使是不同的版本也会被检测到。如对详细的内部结构有任何见解(文件/视频),我们将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  9
  •   Marcin Zukowski    6 年前

    这是一个复杂的问题,但基本思路如下(相当简单):

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

    所以Snowflake不需要记录键,因为每个记录在给定时间只存储在一个活动文件中。

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

    要了解更多信息,我建议去雪花论坛询问。