首页 > 解决方案 > 更新数百万行,还是删除/插入?

问题描述

抱歉,描述太长了……但我们走了……

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

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

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

生成这些扩展属性值的过程需要映射到某个查找表的堡垒,我们从中得到每一行的几种可能性,然后选择最好的一种(每个初始行一个)。这可能是处理器密集型的。

问题(终于!):

想象一下,我的查找表被修改了,我想只为我的初始事实表的一个子集重新评估扩展属性。

我最终会在目标扩展事实表中修改几百万行。

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

  1. 我应该写一个带有连接的 UPDATE 语句吗?

  2. 删除这一百万行并插入新行会更好吗?

  3. 任何其他方式,比如创建一个只有适当的 INSERT 的新扩展事实表?

谢谢

埃里克

PS:我来自 SQL Server 背景,其中 DELETE 可能很慢

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

标签: snowflake-cloud-data-platform

解决方案


Snowflake 与传统 RDBS 的写入性能表现完全不同。您的所有表都保留在 S3 中,并且 S3 不允许您仅重写现有对象的选定字节;必须上传和替换整个文件对象。因此,虽然在数据和索引已就地修改的 SQL 服务器中,根据需要创建新页面,雪花中的 UPDATE/DELETE 是对表文件的完整顺序扫描,创建原始文件的不可变副本,并过滤掉适用的行(删除)或修改(更新),然后替换刚刚扫描的文件。

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

我会看一下MERGE命令,它允许您在一个命令中插入、更新和删除所有内容(有效地将表 A 的差异应用到表 B 中。除其他外,它应该使您的时间旅行成本低于不断擦除和重写表。另一个考虑是,由于雪花是面向列的,理论上列更新应该只需要对该列的 S3 文件进行操作,而插入/删除将替换所有列的所有 S3 文件,这将降低表现。


推荐阅读