большой запрос превышает пределы памяти, как рефакторинг? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть запрос, в котором я пытаюсь получить количество элементов в таблице2 с помощью таблицы1.Следующее является упрощением этого.Большую часть времени он работал нормально, но иногда бывают дни, когда данные структурированы таким образом, что этот SQL-код начинает вызывать ошибки, связанные с ограничением памяти.Я пытался отладить его с помощью планировщика запросов.Это говорит о том, что у него заканчиваются ресурсы на этапе агрегирования, но, глядя на информацию о планировщике, я все еще не могу понять, почему у него не хватает памяти.Можно ли переписать этот запрос другим способом, чтобы он занимал меньше памяти?Вот сценарий сбоя планировщика запросов image 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 голосов
/ 07 декабря 2018

Похоже, что в случае моего запроса я могу разбить большое агрегирование на представления (CTE), вычислить каждое отдельное агрегирование и затем объединить все обратно вместе.Во-вторых, использование COUNTIF также работает, хотя заметной разницы в производительности нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...