google-cloud-platform - BigQuery MERGE 语句计费的字节数超过编辑器显示的字节数
问题描述
我有一个非常大的(3.5B 记录)表,我想使用MERGE
BigQuery 中的语句更新/插入(upsert)。源表是一个暂存表,只包含新数据,我需要检查目标表中是否有对应ID的记录,如果是则更新行,否则插入。
目标表由一个名为 的整数字段进行分区,并在另一个名为 的整数字段IdParent
上完成匹配。我的合并语句/脚本如下所示:IdParent
IdChild
declare parentList array<int64>;
set parentList = array(select distinct IdParent from dataset.Staging);
merge into dataset.Target t
using dataset.Staging s
on
-- target is partitioned by IdParent, do this for partition pruning
t.IdParent in unnest(parentList)
and t.IdParent = s.IdParent
and t.IdChild = s.IdChild
when matched and t.IdParent in unnest(parentList) then
update
set t.Column1 = s.Column1,
t.Column2 = s.Column2,
...<more columns>
when not matched and IdParent in unnest(parentList) then
insert (<all the fields>)
values (<all the fields)
;
所以我:
从临时表中拉出
IdParent
列表以了解要修剪的分区在连接谓词中限制目标表的分区
还限制了匹配/不匹配条件下目标表的分区
总大小dataset.Target
约为 250GB。如果我将此脚本放在我的 BQ 编辑器中并删除所有内容,IdParent in unnest(parentList)
那么它会在编辑器中显示 ~250GB 的账单(正如预期的那样,因为没有分区修剪)。如果我添加IdParent in unnest(parentList)
后面的脚本,那么脚本与您在上面看到的完全一样,即尝试进行分区修剪,编辑器会显示 ~97MB 来计费。但是,当我查看查询结果时,我发现它实际计费约为 180GB:
目标表也在被匹配的两个字段上进行聚类,我知道聚类的好处通常不会显示在编辑的估计中。但是,我的理解是,这只会使计费的字节更小……我想不出任何原因会发生这种情况。
这是一个 BQ 错误,还是我只是错过了什么?BigQuery 甚至没有说“脚本估计要处理 XX MB”,它说“这将处理 XX MB”,然后它处理得更多。
解决方案
这很有趣。你所做的似乎完全正确。
似乎 BQ 查询计划器可以正确解释您的 SQL 并知道提供了分区修剪,但是当它执行时。它没有这样做。
尝试t.IdParent in unnest(parentList)
从这两个when matched
子句中删除以查看问题是否仍然存在,即
declare parentList array<int64>;
set parentList = array(select distinct IdParent from dataset.Staging);
merge into dataset.Target t
using dataset.Staging s
on
-- target is partitioned by IdParent, do this for partition pruning
t.IdParent in unnest(parentList)
and t.IdParent = s.IdParent
and t.IdChild = s.IdChild
when matched then
update
set t.Column1 = s.Column1,
t.Column2 = s.Column2,
...<more columns>
when not matched then
insert (<all the fields>)
values (<all the fields)
;
如果无法解决,最好向 BigQuery 提交错误。
推荐阅读
- flutter - 如何在颤动中制作动画
- azure-devops - 自托管 Windows 构建代理失败的需求
- html - css 属性如何显示 none 和 block 在 html 文件中工作?
- android - 如何在 android studio 中将图像转换为所需的像素图像并将其上传到云存储
- animation - 搅拌机中的对象移位
- powerquery - PowerQuery条件列中的多个条件
- react-native - 渲染项目未显示
- r - 从多边形子集中提取栅格内值的百分比分布
- f# - 用两个参数调用一个参数函数?
- static - 为什么跨不同源文件的多个变量定义是一个问题,但跨不同源的多个类定义不是