UPDATE millions of rows, or DELETE/INSERT?

Eri*_*met 4 snowflake-cloud-data-platform

Sorry for the longish description... but here we go...

We have a fact table somewhat flattened with a few properties that you might have put in a dimension in a more "classic" data warehouse. I expect to have billions of rows in that table.

We want to enrich these properties with some cleansing/grouping that would not change often, but would still do from time to time.

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

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

问题(最后!):

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

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

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

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

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

  3. 还有其他方法吗,比如创建一个仅包含适当插入的新扩展事实表?

谢谢

埃里克

PS:我有 SQL Server 背景,DELETE 可能很慢

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

Dan*_*y C 5

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

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

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

  • @SimonD,看起来你是对的,我回去在文档中找到了一些内容,进一步支持你所说的:“表被水平分区成大的、不可变的文件,这些文件相当于传统数据库系统中的块或页面在每个文件中,每个属性或列的值都分组在一起并进行高度压缩,这是文献中称为 PAX 或混合柱状的众所周知的方案。” (2认同)