bigquery查询超出内存限制,如何重构?

时间:2018-12-06 18:19:14

标签: google-bigquery

我有一个查询,我试图使用table1获取table2中的项目计数。以下是它的一个简化。在大多数情况下,它运行良好,但是随后,在某些日子里,以这种sql代码开始引起内存限制错误的方式构造数据。我一直在尝试使用查询计划程序对其进行调试。它说它在聚合阶段用尽了资源,但是查看计划程序信息,我仍然无法理解为什么它用尽了内存。可以使用其他方式重写此查询以使其使用更少的内存吗?这是查询计划程序失败的阶段图像enter image description here

-- 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;

1 个答案:

答案 0 :(得分:0)

对于我的查询,似乎可以将大型聚合分解为视图(CTE),计算每个单独的聚合,然后将所有内容重新结合在一起。其次,尽管没有明显的性能差异,但使用COUNTIF也可以。