2016-08-08 5 views
2

Я пытаюсь запустить довольно простой запрос, но он не работает с ошибкой Resources exceeded.
Я прочитал in another post, что эвристика, используемая для распределения количества микшеров, может время от времени терпеть неудачу.ARRAY_AGG, ведущий к OOM

SELECT 
    response.auctionId, 
    response.scenarioId, 
    ARRAY_AGG(response) AS responses 
FROM 
    rtb_response_logs.2016080515 
GROUP BY 
    response.auctionId, 
    response.scenarioId 

Есть ли способ, чтобы исправить мой вопрос, зная, что:

  • response состоит из 38 полей (большинство из них коротких строк)
  • max(count()) одного response является своего рода недорогим (165)

Сбой запроса
Ошибка: Ресурсы превышены во время выполнения запроса.
ID работы: teads-1307: bquijob_257ce97b_1566a6a3f27

ответ

1

Это ограничение тока, что массивы (производства ARRAY_AGG или другими средствами) должны соответствовать в памяти одной машины. Однако мы сделали несколько недавних улучшений, которые должны помочь уменьшить ресурсы, необходимые для таких запросов, как это. Для того, чтобы подтвердить, является ли этим вопросом, вы можете попробовать такие запросы, как:

SELECT 
    SUM(LENGTH(FORMAT("%t", response))) AS total_response_size 
FROM 
    rtb_response_logs.2016080515 
GROUP BY 
    response.auctionId, 
    response.scenarioId 
ORDER BY total_response_size DESC LIMIT 1; 

Это форматирует структуры в виде строк в качестве грубой эвристики, сколько памяти они бы представлять. Если результат очень большой, то, возможно, мы сможем реструктурировать запрос, чтобы использовать меньше памяти. Если результат не очень большой, тогда возникает другая проблема, и мы рассмотрим ее исправление :) Спасибо!

Смежные вопросы