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

Posted

技术标签:

【中文标题】雪花如何在内部执行更新?【英文标题】:How snowflake internally performs updates? 【发布时间】:2018-07-17 03:50:20 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于雪花如何在内部执行更新?的主要内容,如果未能解决你的问题,请参考以下文章

JVM 如何在内部处理竞争条件?

数据库提交如何在内部工作

Android 推送通知关闭:它是如何在内部工作的?

getLastLocation API 如何在内部工作?即使位置设置为 ON,它也会返回 null

如何在 macOS 中更新 lldb

SignalR 如何在内部工作?