Google bigquery Chrome UX报告:提高查询性能

Google bigquery Chrome UX报告:提高查询性能,google-bigquery,chrome-ux-report,Google Bigquery,Chrome Ux Report,我正在使用以下查询查询Chrome UX报告公共数据集,以获取一组特定于国家/地区的表的随时间变化的指标值。查询运行了很长时间,我在180秒时停止了它,因为我不知道查询的超时时间是多少,也不知道如何判断查询是否挂起 我试图获得平均fcp、平均fp和平均dcl的年度累计数据。我不确定是否正确使用了BigQuery,或者是否有方法优化查询以使其运行更快 这就是我正在使用的查询 选择 _表_后缀为yyyymm, 平均密度作为平均值, 平均密度作为平均值, 平均密度作为平均值 从…起 `chrome用户

我正在使用以下查询查询Chrome UX报告公共数据集,以获取一组特定于国家/地区的表的随时间变化的指标值。查询运行了很长时间,我在180秒时停止了它,因为我不知道查询的超时时间是多少,也不知道如何判断查询是否挂起

我试图获得平均fcp、平均fp和平均dcl的年度累计数据。我不确定是否正确使用了BigQuery,或者是否有方法优化查询以使其运行更快

这就是我正在使用的查询

选择 _表_后缀为yyyymm, 平均密度作为平均值, 平均密度作为平均值, 平均密度作为平均值 从…起 `chrome用户体验报告。国家/地区。*`, unnest first_paint.histogram.bin作为fp, UNNESTdom_content_loaded.histogram.bin作为dcl, UNNESTfirst_contentful_paint.histogram.bin作为fcp 哪里 form_factor.name=‘桌面’和 fcp.start>20000 分组 年月 订购人 年月 让我开始说,这是非常长的6个小时,所以你不应该在这方面有问题,但你可能会遇到其他错误

我们内部也有同样的问题,我们有一些数据集,数据被划分在国家表中,即使在对大量的表进行查询时,这些表是按时间戳进行划分的,但查询不仅需要很长时间,有时还会因资源超出错误而失败

我们的解决方案是将所有这些表聚合到一个单独的表中,添加“country”列,并将其用作集群列。这不仅使我们的查询得以执行,而且使它们比我们的临时解决方案更快,我们的临时解决方案是在国家/地区表的子集上运行相同的查询作为中间步骤,然后将结果组合在一起。它现在更快、更容易、更干净

回到您的具体问题,我建议创建一个新表,您将需要它承载$$$,它是数据集中所有表的组合,作为分区表

最快的方法是使用CREATETABLE语句,不幸的是,您将为查询扫描支付更昂贵的费用

create table `project_id.dataset_id.table_id`
partition by date_month
cluster by origin
as (
select
  date(PARSE_TIMESTAMP("%Y%m%d", concat(_table_suffix, "01"), "UTC")) as date_month,
  *
from `chrome-ux-report.country_cl.*`
);
如果此查询失败,您可以在表的子集上运行它,例如,其中以表的后缀“2018”开始,并针对您之前创建的表运行以下带有“写入附加”配置的查询

select
  date(PARSE_TIMESTAMP("%Y%m%d", concat(_table_suffix, "01"), "UTC")) as date_month,
  *
from `chrome-ux-report.country_cl.*`
where starts_with(_table_suffix, '2019')
如果你注意到了,我还使用了一个集群列,这是一个最佳实践

请注意,谁在管理谷歌公共数据集


如果有一个公共chrome_ux_报告数据集,其中只有一个按日期分区并按国家/地区聚集的表,那就太好了。

仔细查看您的查询后,我得出结论,您正在执行的每个操作的处理时间大约为6秒或更短。因此,我决定从每个unnest执行每个任务,然后使用方法将表附加在一起

查询在4秒内运行。语法是:

SELECT
  _TABLE_SUFFIX AS yyyymm,
  AVG(fcp.density) AS average_fcp,
FROM
  `chrome-ux-report.country_cl.*`, 
  UNNEST(first_contentful_paint.histogram.bin) AS fcp
WHERE
  form_factor.name = 'desktop' AND
  fcp.start > 20000
GROUP BY
  yyyymm


UNION ALL 

SELECT
  _TABLE_SUFFIX AS yyyymm,
  AVG(fp.density) as average_fp,

FROM
  `chrome-ux-report.country_cl.*`, 
  UNNEST(first_paint.histogram.bin) as fp
WHERE
  form_factor.name = 'desktop' 
GROUP BY
  yyyymm

UNION ALL 

SELECT
  _TABLE_SUFFIX AS yyyymm,
  AVG(dcl.density) as average_dcl
FROM
  `chrome-ux-report.country_cl.*`, 
  UNNEST(dom_content_loaded.histogram.bin) as dcl
WHERE
  form_factor.name = 'desktop' 
GROUP BY
  yyyymm
ORDER BY
  yyyymm  
此外,我想指出,根据文档,建议避免过度使用通配符,选择使用日期范围并具体化大型数据集结果。另外,我想将BigQuery指向10gb


我希望这能有所帮助。

我不确定得到所有密度的平均值在数学上是否有意义,但我们还是这样做吧

查询中更大的问题是:

  UNNEST(first_paint.histogram.bin) as fp,
  UNNEST(dom_content_loaded.histogram.bin) as dcl,
  UNNEST(first_contentful_paint.histogram.bin) AS fcp
-这是一个爆炸性的连接:它将一行3个数组(每个数组约500个元素)转换为1.25亿行!!!这就是查询没有运行的原因

提供类似结果的类似查询:

选择yyyymm, 平均值平均值, 平均值平均值, 平均值平均值 从…起 选择 _表_后缀为yyyymm, 从UNNESTfirst_contentful_paint.histogram.bin fcp中选择AVGfcp.density,其中fcp.start>20000作为平均值, 从UNNESTfirst_paint.histogram.bin fp中选择AVGfp.density作为平均值_fp, 从UNNESTdom\u content\u loaded.histogram.bin dcl中选择AVGdcl.density作为平均值\u dcl 摘自“chrome ux report.country_cl.*” 其中form_factor.name='桌面' 按yyyymm分组 yyyymm前订购 好消息是:此查询运行时间为3.3秒

现在查询只需3秒钟,最重要的问题是:它在数学上有意义吗

奖励:从数学上讲,这个查询对我来说更有意义,但我不是100%确定:

选择yyyymm, 平均值平均值, 平均值平均值, 平均值平均值 从…起 选择yyyymm、原点、SUMweighted\u fcp average\u fcp、SUMweighted\u fp average\u fp、SUMweighted\u dcl average\u dcl 从…起 选择 _表_后缀为yyyymm, 从UNNESTfirst_contentful_paint.histogram.bin中选择SUMstart*密度作为加权值_fcp, 从UNNESTfirst_paint.histogram.bin中选择SUMstart*密度作为加权_fp, 从UNNESTdom\u content\u loaded.histogram.bin中选择SUMstart*density作为加权的\u dcl, o 里金 摘自“chrome ux report.country_cl.*” 按来源分组,yyyymm 按yyyymm分组 yyyymm前订购
我最初使用sum,但不确定哪一个更好。我已经用这两种方法进行了测试,但在示例I postedI中,我添加了一个更有意义的额外查询-我们现在缺少的是您想要回答的基本问题,可能是一个新的堆栈溢出问题,说明了您的目标。对于这个问题,我们解决了查询效率的问题。很好的观察!我补充了另一个答案,指出问题是做3次不必要的尝试