【问题标题】:BigQuery Query exceeded resource limits. when using joins with ORBigQuery 查询超出资源限制。使用 OR 连接时
【发布时间】:2020-03-03 20:12:12
【问题描述】:

我有 BigQuery 数据库,执行 30 秒后出现错误:

查询超出资源限制。 34012.91515312311 CPU 秒数 已使用,并且此查询必须使用少于 20200.0 CPU 秒。

使用此类查询时:

SELECT
  b.date as Date, 
  SUM(b.revenue) as Revenue
FROM `dataset.a` a
JOIN `dataset.b` b ON b.id = a.low_id OR UPPER(b.id) = a.high_id
WHERE DATE(a.date_and_time) >= DATE('2020-02-01')
AND DATE(a.date_and_time) <= DATE('2020-02-25')

GROUP BY b.date
ORDER BY b.date

我注意到,如果我删除分组并只返回 b 记录,它将工作并持续 40 秒。 但是,当我从 JOIN 中删除 b.id = a.low_idUPPER(b.id) = a.high_id 时,它会起作用并持续 3 秒!

您能解释一下这种行为吗? 在不购买额外插槽的情况下让这个查询工作是真的吗?

【问题讨论】:

  • 我很惊讶 BigQuery 甚至接受查询。请提供样本数据和期望的结果。 OR 会扼杀查询性能。为什么你需要在id 上使用UPPER()——但只是为了比较?
  • @GordonLinoff 我无法显示数据,但可以描述它:表 a 包含有关苹果和安卓安装、android_id 和 apple_id 的信息(苹果 id 以大写形式存储)。表 b 有关于广告视图的信息,它有字段 advertising_id 匹配表 a 中大写的 android_id 字段或 apple_id 字段。每个 b 记录也有一个收入和日期。我想按日期查看特定日期的收入。每个表大小为 250 mb

标签: sql join google-bigquery


【解决方案1】:

尝试使用这个技巧。它从两个 id 构造一个数组,然后将它们取消嵌套。剩下的就是你的JOIN

SELECT b.date as Date, SUM(b.revenue) as Revenue
FROM `dataset.a` a JOIN
     (`dataset.b` bl CROSS JOIN
      UNNEST(ARRAY(a.low_id, a.hi_id)) a_id
     )
      ON bl.id = a.a_id 
WHERE DATE(a.date_and_time) >= DATE('2020-02-01') AND
      DATE(a.date_and_time) <= DATE('2020-02-25')
GROUP BY b.date
ORDER BY b.date

【讨论】:

  • 感谢工作,持续时间接近 3 秒!你能解释一下为什么OR 会杀死查询性能吗?
  • @AlexZaitsev 。 . . BigQuery 未正确优化它。显然查询可以重写。我猜 BigQuery 看到 OR 并决定序列化查询 - 最终耗尽资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多