雪花内部如何执行更新?

时间:2018-02-07 00:03:56

标签: sql-update cloud snowflake-datawarehouse

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

有关详细信息,我建议您前往Snowflake论坛并询问。