Ресурсы превышены во время выполнения запроса

Я пытаюсь запустить запрос, соединяющий два больших набора данных, и я поражаю ресурсы, превышенные при ошибке выполнения запроса. Я читал, что есть работа вокруг, когда вы используете Join Every и Group Every, но не об этом.

SELECT 
  year(users.firstseen) as first_year,
  month(users.firstseen) as first_month, 
  DATEDIFF(orders.timestamp,users.firstseen) as days_elapsed,
  count(orders.user_key) as count_orders
FROM 
  [project.orders] as orders
JOIN EACH
  [project.users] AS users
ON
  orders.user_key = users.user_key
WHERE orders.store = 'ios'
GROUP EACH BY 1,2,3

Изменить: работало следующее:

SELECT
  year(users.firstseen) as firstyear,
  month(users.firstseen) as firstmonth,
  DATEDIFF(orders.timestamp, users.firstseen) as days_elapsed,
  COUNT(users.firstseen) AS count_orders FROM [project.orders] as orders
JOIN EACH( SELECT user_key, firstseen FROM [project.users]
WHERE store_key = 'ios') as users ON orders.user_key = users.user_key
GROUP BY firstyear, firstmonth, days_elapsed
ORDER BY firstyear, firstmonth, days_elapsed

Ответ 1

JOIN EACH может выйти из строя, если ваши ключи соединения (в данном случае, user_key) распределены неравномерно. Например, если у вас есть одна user_key, которая появляется ненормально часто, вы получите ошибку "ресурсы превышены" из node, которая обрабатывает этот ключ. В качестве альтернативы вы можете попробовать выполнить запрос по меньшему набору пользовательских ключей, отфильтровывая часть пользовательских ключей перед соединением.

GROUP EACH BY может выйти из строя, если у вас слишком много разных групповых клавиш. Вы можете попробовать сгладить выход соединения, добавив еще несколько предложений WHERE, чтобы убедиться, что это так.

В принципе, я бы порекомендовал сжимать входы как JOIN EACH, так и GROUP EACH BY до тех пор, пока вы не получите запрос на работу, и тогда у вас будет больше смысла для ограничений, с которыми вы столкнулись. Как только вы это знаете, вы можете (надеюсь) структурировать свои запросы, чтобы максимально использовать доступные ресурсы.

(BTW, мы планируем настроить эти операции в ближайшем будущем, чтобы удалить некоторые ограничения, которые вы можете нанести!)