据我所知,底层文件(列格式)是不可变的。我的问题是,如果文件是不可变的,那么更新是如何执行的。Snowflake 是否维护同一行的不同版本,并根据 key 返回最新版本?还是将数据插入到幕后的新文件中并删除旧文件?如果时间旅行设置为 90 天,因为 Snowflake 需要维护同一行的不同版本,那么在这些场景中性能如何受到影响(查询当前数据)。但是由于 Snowflake 不尊重键,因此甚至可以检测到不同的版本。任何有关详细内部结构的见解(文档/视频)都值得赞赏。
问问题
1720 次
1 回答
9
这是一个复杂的问题,但一个基本的想法如下(相当简化):
- 记录存储在 S3 上的不可变微分区中
- 表是微分区的列表
- 修改记录时
- 它的旧微分区被标记为非活动(从那一刻起),
- 创建一个新的微分区,其中包含修改后的记录,以及来自该微分区的其他记录。
- 新的微分区被添加到表的列表中(从那一刻起标记为活动)
- 不活动的微分区在一段时间内不会被删除,允许时间旅行
因此,Snowflake 不需要记录键,因为每条记录在给定时间仅存储在一个活动文件中。
执行更新对查询的影响微乎其微,唯一可见的影响可能是需要从 S3 获取文件并缓存在仓库中。
有关更多信息,我建议您去 Snowflake 论坛并在那里询问。
于 2018-02-07T05:31:15.873 回答