【发布时间】:2019-07-17 15:55:39
【问题描述】:
我正在努力处理这个查询(虚拟版本,其中有更多字段):
UPDATE
table1 as base
SET
lines =
ARRAY(
SELECT AS STRUCT
b.line_id,
s.purch_id,
ARRAY(
SELECT AS STRUCT
wh.warehouse_id,
s.is_proposed,
FROM table1 as t, UNNEST(lines) as lb, UNNEST(lb.warehouses) as wh
INNER JOIN
(SELECT
l.line_id,
wh.is_proposed
FROM table2, UNNEST(lines) as l, UNNEST(l.warehouses) as wh) as s
ON lb.line_id = s.line_id AND wh.warehouse_id = s.warehouse_id)
FROM table1, UNNEST(lines) as b
INNER JOIN UNNEST(supply.lines) as s
ON b.line_id = s.line_id)
FROM
table2 as supply
WHERE
base.date = supply.date
AND
base.sales_id = supply.sales_id
table1 和 table2 具有相同的嵌套:
-
lines:重复记录 -
lines.warehouses: 行内重复记录
(so {... , lines [{... 仓库 [)
另外,table1 是 table2 的子集,它的字段子集,table1 从一开始就将它们设为 NULL(当数据可用时我会刷新信息,因为信息是异步的)。
我首先尝试了这个作为第一步(成功):
UPDATE
table1 as base
SET
lines =
ARRAY(
SELECT AS STRUCT
b.line_id,
s.purch_id,
b.warehouses
FROM table1, UNNEST(lines) as b
INNER JOIN UNNEST(supply.lines) as s
ON b.line_id = s.line_id)
FROM
table2 as supply
WHERE
base.date = supply.date
AND
base.sales_id = supply.sales_id
但事实上我也需要更新lines.warehouses,所以我很高兴它可以工作,但这还不够。
完整的查询是有效的,当我在终端中尝试最后一个 ARRAY 部分时,查询速度很快并且输出没有重复。 完整的 UPDATE 仍然没有结束(20 分钟后,我杀了它)。
桌子并没有那么大,两边各 20k(220k 完全展平)。
那么我做错了吗? 有没有更好的办法?
谢谢
【问题讨论】:
-
我相信您在第 9 行的 ARRAY(...) 语句是导致问题的原因。我很确定这是两个问题之一。 ARRAY() 中的
select可能会执行一次,返回一个大结果,并将该大结果更新到table1中的每一行。另一种可能性是 ARRAY() 中的select被执行了很多次(UNNEST(lines)中的每一行执行一次)。听起来都没有表现。 -
我想到了类似的东西,因为查询不断添加输出/步骤(如果我正确理解工作细节)。你知道实现这一目标的任何其他模式吗?我想象将两个表展平,然后加入,然后重新嵌套,但似乎不可能使用 UPDATE 模式
标签: google-bigquery