Snowflake cloud data platform 更新数百万行,还是删除/插入?

Snowflake cloud data platform 更新数百万行,还是删除/插入?,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,抱歉这么长的描述。。。但是我们走了 我们有一个事实表,其中包含一些属性,您可能已经将这些属性放在更“经典”的数据仓库中的维度中。 我希望该表中有数十亿行 我们希望通过一些清理/分组来丰富这些属性,这些清理/分组不会经常更改,但仍会不时更改 我们正在考虑将这个初始事实表保留为我们从不更新或删除的“主”事实表,并在添加新的派生属性的地方创建它的“扩展事实”表副本 生成这些扩展属性值的过程需要映射到查找表的某些部分,从中我们可以为每一行获取多个可能性,然后选择最佳的一个(每个初始行一个)。 这可能是处

抱歉这么长的描述。。。但是我们走了

我们有一个事实表,其中包含一些属性,您可能已经将这些属性放在更“经典”的数据仓库中的维度中。 我希望该表中有数十亿行

我们希望通过一些清理/分组来丰富这些属性,这些清理/分组不会经常更改,但仍会不时更改

我们正在考虑将这个初始事实表保留为我们从不更新或删除的“主”事实表,并在添加新的派生属性的地方创建它的“扩展事实”表副本

生成这些扩展属性值的过程需要映射到查找表的某些部分,从中我们可以为每一行获取多个可能性,然后选择最佳的一个(每个初始行一个)。 这可能是处理器密集型的

问题(最后!):

假设我的查找表被修改,我只想重新评估初始事实表的一个子集的扩展属性

最终,我会在目标扩展事实表中得到几百万行要修改的内容

实现此更新的最佳方式是什么?(更新数十亿行表中的数百万行)

  • 我应该写一个带有连接的UPDATE语句吗

  • 删除这一百万行并插入新的行是否更好

  • 还有其他方法吗,比如只使用适当的插入创建新的扩展事实表

  • 谢谢

    埃里克

    PS:我来自SQL Server背景,在那里删除可能很慢


    PPS:我也仍然喜欢SQL Server!:-)

    雪花与传统RDB的写入性能表现截然不同。所有表都保存在S3中,S3不允许您只重写现有对象的选定字节;必须上载并替换整个文件对象。因此,在SQL server中,数据和索引被就地修改,并根据需要创建新页面,而snowflake中的更新/删除是对表文件的完整顺序扫描,创建原始文件的不可变副本,其中包含筛选(删除)或修改(更新)的适用行,然后替换刚刚扫描的文件

    因此,无论是更新1行还是1M行,至少都必须重写修改数据所在的整个微分区


    我来看看这个命令,它允许您在一个命令中插入、更新和删除所有内容(有效地将表A中的差异应用到表B中。除其他外,它应该使您的表保持稳定,而不是不断地擦除和重写表。另一个考虑因素是,由于snowflake是面向列的,因此理论上,列更新只需要对该列的S3文件进行操作,而insert/delete将替换所有列的所有S3文件,这将降低性能。

    Eric,如果您能确定表合并的键,那么如果您的表集群良好,则合并将比删除/插入十亿行要好。我们是“相对”Snowflake是一个新手,到目前为止,我们还没有进行聚类,因为Snowflake应该在开箱即用的情况下做得很好……据说!看起来我们应该更有趣地研究这方面。根据你的回答和Rajib的评论,似乎我们需要研究非自动聚类。很多人认为Snowflake是一个混合型的专栏一行始终位于单个文件中,并且从不在微分区文件之间分割。这意味着,即使您更新单个列,它仍需要重新写入相同数量的微分区,就像您更新所有列一样。@SimonD,看起来您是对的,我回去时在文档中找到了一些东西,我有这些进一步支持您所说的:“表被水平地划分为大型、不可变的文件,这些文件相当于传统数据库系统中的块或页。在每个文件中,每个属性或列的值都被分组在一起并进行了大量压缩,这是文献中称为PAX或hybrid columnar的著名方案。”“每个表文件都有一个标头,其中除其他元数据外,还包含文件中每列的偏移量。由于S3允许对部分文件进行GET请求,因此查询只需下载文件标头和它们感兴趣的列。“因此,对于阅读,雪花可以以专栏的方式运作,但对于写作,则不然。是的,我想我也读过。甚至有一段2018年的YouTube视频,其中一位工程师也解释了这一点。