【发布时间】:2016-04-22 16:09:40
【问题描述】:
我们有一个用例,其中我们在一个表中有数亿个条目,并且在进一步拆分它时遇到了问题。 99% 的操作是仅追加的。但是,我们偶尔会进行更新和删除,Google 自己说只有删除一个表并使用最新数据创建一个新表才能实现。
因为数据量很大,我们希望在 30 秒左右更新表,所以我们考虑了将 原始表 与 刷新表 连接的可能性> 在某种程度上,我们只有出现在原始表中但不在刷新表中的条目(删除的情况)或使用刷新表中的数据写入项目(如果找到)(更新的情况)。输出/目标应该是新表,然后我们将使用 WRITE_TRUNCATE(覆盖)将其复制回原始表。如果更新似乎太复杂,我们可以使用仅删除逻辑并自己重新插入更新的项目。
这可能吗?哪种类型的连接似乎最合适?我们会将更新插入到 Refresher 表中,并定期清理 Original 表。我们不必为重新插入整个原始表(无论是时间还是金钱)付费,而只需查询一次以及将少数流式插入更新表。
编辑:我们可以忍受查询过时的数据,直到定期合并发生。我们还可以在维护期间暂停查询一小段时间。
欢迎任何想法。
【问题讨论】:
-
为什么不直接接受更新作为表中的新行,并让查询只读取表中的最后一行?这要容易得多。你考虑过这个吗?
-
这听起来像是我们应该评估/基准的选项!感谢您的精彩输入。我们必须检查哪一个对我们正在进行的查询的干扰最小。我们仍然对连接如何完成这项工作感兴趣。是反加入吗?
标签: google-bigquery