Sql 了解什么导致;资源过剩";GBQ中的错误?

Sql 了解什么导致;资源过剩";GBQ中的错误?,sql,google-analytics,google-bigquery,Sql,Google Analytics,Google Bigquery,我在谷歌分析数据的BigQuery工作。在开发查询的不同阶段,我都会遇到错误:“资源已超出”。我想进一步了解正在发生的事情。我已经成功地解决了这个问题,但只是通过反复试验 当我使用explain工具时,它似乎是任何查询或子查询的“计算”部分,看起来已经超出了资源 下面是一个标准SQL查询的示例,该查询的成功/失败取决于某些部分是否保留在: SELECT fullVisitorId, visitId, h.type AS type, h.hitNumber AS

我在谷歌分析数据的BigQuery工作。在开发查询的不同阶段,我都会遇到错误:“资源已超出”。我想进一步了解正在发生的事情。我已经成功地解决了这个问题,但只是通过反复试验

当我使用explain工具时,它似乎是任何查询或子查询的“计算”部分,看起来已经超出了资源

下面是一个标准SQL查询的示例,该查询的成功/失败取决于某些部分是否保留在:

  SELECT
    fullVisitorId,
    visitId,
    h.type AS type,
    h.hitNumber AS hitNumber,
    h.eventInfo.eventAction AS action,
    LOWER(h.eventInfo.eventCategory) AS category,
    h.page.pagePath AS page,
    h.page.pageTitle AS landingTitle,
    h.page.searchKeyword AS searchTerm,
    LEAD(h.page.pagePath) OVER (PARTITION BY fullVisitorId, visitId ORDER BY h.hitNumber ASC) AS landingPage,
    SPLIT(h.eventInfo.eventLabel, ':')[OFFSET(0)] AS clickTitle,
    CASE WHEN LEAD(h.page.pageTitle) OVER (PARTITION BY fullVisitorId, visitId ORDER BY h.hitNumber ASC) = SPLIT(h.eventInfo.eventLabel, ':')[OFFSET(0)] THEN true ELSE false END AS searchClick     
 FROM `project.dataset.ga_sessions_*` AS main, UNNEST(hits) AS h 
  WHERE _TABLE_SUFFIX BETWEEN '20170401' AND '20170430'
AND (
  (
    h.eventInfo.eventAction = 'click' AND LOWER(h.eventInfo.eventCategory) LIKE '/search%'
  )
    OR type = 'PAGE'
)
ORDER BY
  fullVisitorId ASC, visitId ASC, h.hitNumber ASC
删除这些元素集中的任何一个时,查询将运行:

ORDER BY
  fullVisitorId ASC, visitId ASC, h.hitNumber ASC
或:

或:

在单个日期分区上运行时,将运行整个查询

我将我目前的理解描述为肤浅,我对GBQ的内部工作原理以及它如何分配/允许计算资源知之甚少。我确实知道,如果可能的话,它会在不同的机器上进行计算。我以前听人说这些是碎片

我需要了解GBQ compute resources的哪些信息才能理解上述功能为何有效/无效


注:我只有第1层访问权限,但这并不意味着如果我可以证明需要,我就不能获得更多的访问权限。显然,我不想在目前的理解水平下这样做。

我认为在您的查询中唯一应该引起问题的是
ORDER BY
操作。从Jordan的文章中可以看到,这个操作是不可并行的。您还可以检查,以了解导致资源超出错误的原因

不过,问题的其余部分似乎没有问题。我根据我们的数据测试了您的查询,它在20秒内处理了近300Gb的数据:


如果仍然出现错误,则可能是查询了大量数据。在这种情况下,您可以尝试将查询分为更小的日期范围、查询更少的列、添加一些
WHERE
条件以过滤掉一些行、更改层等等。

我认为在查询中唯一应该引起问题的是
ORDER BY
操作。从Jordan的文章中可以看到,这个操作是不可并行的。您还可以检查,以了解导致资源超出错误的原因

不过,问题的其余部分似乎没有问题。我根据我们的数据测试了您的查询,它在20秒内处理了近300Gb的数据:


如果仍然出现错误,则可能是查询了大量数据。在这种情况下,您可以尝试将查询分为更小的日期范围,查询更少的列,添加一些
WHERE
条件以筛选出一些行,更改层等等。

order by是您的资源超出提示,其他人将添加到Science中order by是您的资源超出提示,其他人会加入科学谢谢你的回复。那么,我认为在大于6.5GB的数据集上使用ORDER BY是不可能的,对吗?这似乎是它的临界点。不确定阈值是多少,但通常如果结果集有数百万行,则可能
orderby
不起作用。我在日常工作中发现,实际上,你根本不需要订购大数据集。通常情况下,通过限制结果,然后对其进行排序,大多数任务都是可以完成的(希望你就是这样)。是的,谢天谢地,情况就是这样。order by语句是在查询(不是上面显示的)处理时保留的。我仍然有兴趣了解更多关于GBQ如何并行查询的信息。如果你知道任何好的资源,请随时分享。任何你想知道更多关于谷歌产品的信息,你都可以在那里查看和搜索。对于BigQuery:。此外,他们还有一个很棒的博客:。最重要的是,GCP文档非常好:再次感谢Will-我特别喜欢这里列出的博客标题:感谢您的回复Will。那么,我认为在大于6.5GB的数据集上使用ORDER BY是不可能的,对吗?这似乎是它的临界点。不确定阈值是多少,但通常如果结果集有数百万行,则可能
orderby
不起作用。我在日常工作中发现,实际上,你根本不需要订购大数据集。通常情况下,通过限制结果,然后对其进行排序,大多数任务都是可以完成的(希望你就是这样)。是的,谢天谢地,情况就是这样。order by语句是在查询(不是上面显示的)处理时保留的。我仍然有兴趣了解更多关于GBQ如何并行查询的信息。如果你知道任何好的资源,请随时分享。任何你想知道更多关于谷歌产品的信息,你都可以在那里查看和搜索。对于BigQuery:。此外,他们还有一个很棒的博客:。最重要的是,GCP文档非常好:再次感谢Will-我特别喜欢这里列出的博客标题:
LEAD(h.page.pagePath) OVER (PARTITION BY fullVisitorId, visitId ORDER BY h.hitNumber ASC) AS landingPage,
SPLIT(h.eventInfo.eventLabel, ':')[OFFSET(0)] AS clickTitle,
CASE WHEN LEAD(h.page.pageTitle) OVER (PARTITION BY fullVisitorId, visitId ORDER BY h.hitNumber ASC) = SPLIT(h.eventInfo.eventLabel, ':')[OFFSET(0)] THEN true ELSE false END AS searchClick