我有一个查询,我试图使用table1获取table2中的项目计数。以下是它的一个简化。在大多数情况下,它运行良好,但是随后,在某些日子里,以这种sql代码开始引起内存限制错误的方式构造数据。我一直在尝试使用查询计划程序对其进行调试。它说它在聚合阶段用尽了资源,但是查看计划程序信息,我仍然无法理解为什么它用尽了内存。可以使用其他方式重写此查询以使其使用更少的内存吗?这是查询计划程序失败的阶段图像
-- create table
create table actions1(
start_date datetime --goes back 1 year
, end_date datetime
, action varchar(200)
, idA int64
, idB int64
);
create table actions2(
action2_date datetime
, action varchar(300)
, idA int64
, idB int64
);
-- the query
WITH filter_actions_helper AS (
SELECT
a1.action, a1.start_date, a2.start_date
, ARRAY_AGG(action2_date IGNORE NULL) action2col
FROM
actions1 a1
LEFT JOIN
actions2 a2
using(idA, idB)
GROUP BY
idA, idB
)
, filter_actions AS (
SELECT
idA, idB, start_date, end_date
, sum( if(exists( SELECT * FROM UNNEST(action2col) a WHERE a >= start_date), 1,0) ) engaged
FROM
filter_actions_helper f
GROUP BY
idA, idB
)
select * from filter_actions;
答案 0 :(得分:0)
对于我的查询,似乎可以将大型聚合分解为视图(CTE),计算每个单独的聚合,然后将所有内容重新结合在一起。其次,尽管没有明显的性能差异,但使用COUNTIF也可以。