snowflake-cloud-data-platform - 更新数百万行,还是删除/插入?
问题描述
抱歉,描述太长了……但我们走了……
我们有一个事实表,其中包含一些属性,您可能已经将这些属性放在更“经典”数据仓库中的维度中。我希望该表中有数十亿行。
我们希望通过一些不会经常更改但仍会不时更改的清理/分组来丰富这些属性。
我们正在考虑将这个初始事实表保留为我们从不更新或删除的“主”,并在我们只添加新的派生属性的地方制作它的“扩展事实”表副本。
生成这些扩展属性值的过程需要映射到某个查找表的堡垒,我们从中得到每一行的几种可能性,然后选择最好的一种(每个初始行一个)。这可能是处理器密集型的。
问题(终于!):
想象一下,我的查找表被修改了,我想只为我的初始事实表的一个子集重新评估扩展属性。
我最终会在目标扩展事实表中修改几百万行。
实现此更新的最佳方式是什么?(更新几十亿行表中的几百万行)
我应该写一个带有连接的 UPDATE 语句吗?
删除这一百万行并插入新行会更好吗?
任何其他方式,比如创建一个只有适当的 INSERT 的新扩展事实表?
谢谢
埃里克
PS:我来自 SQL Server 背景,其中 DELETE 可能很慢
PPS:我仍然喜欢 SQL Server!:-)
解决方案
Snowflake 与传统 RDBS 的写入性能表现完全不同。您的所有表都保留在 S3 中,并且 S3 不允许您仅重写现有对象的选定字节;必须上传和替换整个文件对象。因此,虽然在数据和索引已就地修改的 SQL 服务器中,根据需要创建新页面,雪花中的 UPDATE/DELETE 是对表文件的完整顺序扫描,创建原始文件的不可变副本,并过滤掉适用的行(删除)或修改(更新),然后替换刚刚扫描的文件。
因此,无论是更新 1 行还是 1M 行,至少必须重写存在修改数据的整个微分区。
我会看一下MERGE命令,它允许您在一个命令中插入、更新和删除所有内容(有效地将表 A 的差异应用到表 B 中。除其他外,它应该使您的时间旅行成本低于不断擦除和重写表。另一个考虑是,由于雪花是面向列的,理论上列更新应该只需要对该列的 S3 文件进行操作,而插入/删除将替换所有列的所有 S3 文件,这将降低表现。
推荐阅读
- python - 从均值、起始值和结束值绘制偏态分布
- java - 为什么阶段在恢复窗口时忽略新定义的位置?
- python - 如何在同一个 django 模型字段中存储比特币和美元?
- database - 如何从 DynamoDB 中获取所有最新属性值的集合?
- python - 如何在 Django 中更新模型字段后从 MySQL 数据库中查询数据
- javascript - 如何连接前端和后端
- command - 如何使用命令去除重音并保留汉字?
- flutter - 我怎样才能让 pageView.Builder 在颤动中占据所有可用空间?
- c# - 与 .net/c# 相比,HmacSHA256 在 CryptoJs 中返回不同的值
- java - JCache 是否支持缓存读/写的 EJB 事务?